日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開發(fā)C#.NET → 深入Lazy——.NET Framework 4.0

      深入Lazy——.NET Framework 4.0

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:kym/時(shí)間:2010/2/21 23:52:27字體大。A-A+

      作者:佚名點(diǎn)擊:724次評(píng)論:0次標(biāo)簽: .NET

      .NETv3.0 可再發(fā)行組件包
      • 類型:編程輔助大。2.7M語(yǔ)言:中文 評(píng)分:1.8
      • 標(biāo)簽:
      立即下載

      .NET Framework 4 在一次次跳票中終于發(fā)布了,在一次偶然的機(jī)會(huì),我看到了 Anytao 的 [你必須知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T>點(diǎn)滴 。

      我沒有看過(guò)在.NET Framework 4.0 beta2 的 關(guān)于 Lazy<T> 的實(shí)現(xiàn),也不知道正式版與之前的版本是否有過(guò)改進(jìn)(改變),我只在這里來(lái)單純地談在.NET Framework 4 中 Lazy<T> 的實(shí)現(xiàn)。

      1. Lazy<T> 概述

      我們也許會(huì)遇到這樣一種情況,我們有一個(gè)大家伙(大對(duì)象)需要?jiǎng)?chuàng)建,那么這個(gè)對(duì)象的創(chuàng)建時(shí)需要較長(zhǎng)的時(shí)間,同時(shí)也需要在托管堆上分配較多的空間。

      那么在.NET Framework 4 中提供了這樣一個(gè)很聰明的方式:Lazy<T>(我們可以稱之為懶對(duì)象)。當(dāng)然,在之前,很多人也曾對(duì)其進(jìn)行過(guò)自己的實(shí)現(xiàn)。

      那么我們?cè)谶@里就可以把 Lazy<T> 的作用總結(jié)為一句話,按需延遲加載。

      2. Lazy<T> 的使用

      了解了Lazy<T>的作用,讓我們就來(lái)看下Lazy<T>如何應(yīng)用。

      class Program
      {
      static void Main(string[] args)
      {
      Lazy<Large> lazyObject = new Lazy<Large>();
      Console.WriteLine(lazyObject.IsValueCreated);
      lazyObject.Value.Test();
      Console.WriteLine(lazyObject.IsValueCreated);
      }
      }

      [Serializable]
      class Large
      {
      public Large() { }
      public void Test()
      {
      Console.WriteLine("Test");
      }
      }
      運(yùn)行結(jié)果如下:

       

      這個(gè)例子很簡(jiǎn)單,也是Lazy<T>最基本,也是最常用的應(yīng)用方式。

      3. 實(shí)現(xiàn)自己的Lazy<T>

      在.NET Framework 4.0之前,大對(duì)象就是存在的,那么對(duì)于一個(gè)大型系統(tǒng)而言,怎么樣對(duì)付一個(gè)大對(duì)象呢。在我看來(lái)有兩點(diǎn):延遲加載和即時(shí)清理。前者解決創(chuàng)建問(wèn)題,后者解決回收問(wèn)題。

      那么在來(lái)看Lazy<T>的.NET Framework實(shí)現(xiàn)之前,我們先來(lái)自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Lazy<T>吧。

      class MyLazy<T> where T : new()
      {
      private T value;
      private bool isLoaded;
      public MyLazy()
      {
      isLoaded = false;
      }
      public T Value
      {
      get
      {
      if (!isLoaded)
      {
      value = new T();
      isLoaded = true;
      }
      return value;
      }
      }
      }
      這應(yīng)該是最簡(jiǎn)單版本的Lazy<T>了,沒有線程安全檢測(cè),其實(shí)什么都沒有,只有著訪問(wèn)時(shí)創(chuàng)建真實(shí)對(duì)象,可是對(duì)于我們一般的應(yīng)用來(lái)說(shuō)也許就已經(jīng)足夠了。

      4. Lazy<T>的.NET Framework實(shí)現(xiàn)

      原本還想解釋下代碼的,可是太多了,解釋不動(dòng)了…….就寫些主要把。

      其實(shí).NET Framework和上面的實(shí)現(xiàn)大同小異,有兩點(diǎn)主要的不同:

      A. 引入了Boxed內(nèi)部類:

      [Serializable]
      private class Boxed
      {
      // Fields
      internal T m_value;

      // Methods
      [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
      internal Boxed(T value)
      {
      this.m_value = value;
      }
      }
      該內(nèi)部類取代了我在上面實(shí)現(xiàn)中的泛型約束,使之更通用。

      但是我們也應(yīng)該注意到,如果T為結(jié)構(gòu)體,那么由于T很大,所以裝箱拆箱反而也許是個(gè)更耗費(fèi)效率的事情,因此,個(gè)人建議,對(duì)值類型慎用Lazy<T>。

      B. 線程安全的控制

      在線程安全的控制選項(xiàng)中,.NET Framework為我們提供了這樣的枚舉選項(xiàng):

      public enum LazyThreadSafetyMode
      {
      None,
      PublicationOnly,
      ExecutionAndPublication
      }
      不做多余解釋,關(guān)于這三者的具體意思,MSDN中已經(jīng)說(shuō)的很清楚了,可參加 這里 。

      里面的代碼比較麻煩,就不多說(shuō)了。

      5. 完善的大對(duì)象解決方案

      在 Anytao 文章的回復(fù)中,我就提到了一點(diǎn)是:

      個(gè)人倒覺得Lazy+WeakReference才是實(shí)現(xiàn)一個(gè)大對(duì)象的完整解決之道,一個(gè)按需加載,一個(gè)不定清理.....
      加到一起才完美。

      但是 老趙 說(shuō):

      又不是所有的大對(duì)象都需要自動(dòng)清理……

      那么我就不再重復(fù)去總結(jié)了,這兩句話加到一起,我想應(yīng)該可以得出一個(gè)比較完善的大對(duì)象處理方案吧。

      如果這樣,我們是否能對(duì)應(yīng)地去創(chuàng)建一個(gè)單獨(dú)的實(shí)現(xiàn)類:WeakLazy<T>呢。

      這樣相當(dāng)于我們有了WeakReference,有了Lazy<T>,還有了WeakLazy<T>,那么我們是不是就可以很完整地根據(jù)情況選擇應(yīng)用了呢!

      6. 總結(jié)

      原本想寫一些稍微深入點(diǎn)的東西,可是寫到最后,發(fā)現(xiàn)仍為皮毛而,嘆乎……

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)