• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發C#.NET → 深入Lazy——.NET Framework 4.0

    深入Lazy——.NET Framework 4.0

    相關軟件相關文章發表評論 來源:kym/時間:2010/2/21 23:52:27字體大?。?em class="fontsize">A-A+

    作者:佚名點擊:724次評論:0次標簽: .NET

    .NETv3.0 可再發行組件包
    • 類型:編程輔助大?。?i>2.7M語言:中文 評分:1.8
    • 標簽:
    立即下載

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

    我沒有看過在.NET Framework 4.0 beta2 的 關于 Lazy<T> 的實現,也不知道正式版與之前的版本是否有過改進(改變),我只在這里來單純地談在.NET Framework 4 中 Lazy<T> 的實現。

    1. Lazy<T> 概述

    我們也許會遇到這樣一種情況,我們有一個大家伙(大對象)需要創建,那么這個對象的創建時需要較長的時間,同時也需要在托管堆上分配較多的空間。

    那么在.NET Framework 4 中提供了這樣一個很聰明的方式:Lazy<T>(我們可以稱之為懶對象)。當然,在之前,很多人也曾對其進行過自己的實現。

    那么我們在這里就可以把 Lazy<T> 的作用總結為一句話,按需延遲加載。

    2. Lazy<T> 的使用

    了解了Lazy<T>的作用,讓我們就來看下Lazy<T>如何應用。

    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");
    }
    }
    運行結果如下:

     

    這個例子很簡單,也是Lazy<T>最基本,也是最常用的應用方式。

    3. 實現自己的Lazy<T>

    在.NET Framework 4.0之前,大對象就是存在的,那么對于一個大型系統而言,怎么樣對付一個大對象呢。在我看來有兩點:延遲加載和即時清理。前者解決創建問題,后者解決回收問題。

    那么在來看Lazy<T>的.NET Framework實現之前,我們先來自己實現一個簡單的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;
    }
    }
    }
    這應該是最簡單版本的Lazy<T>了,沒有線程安全檢測,其實什么都沒有,只有著訪問時創建真實對象,可是對于我們一般的應用來說也許就已經足夠了。

    4. Lazy<T>的.NET Framework實現

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

    其實.NET Framework和上面的實現大同小異,有兩點主要的不同:

    A. 引入了Boxed內部類:

    [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;
    }
    }
    該內部類取代了我在上面實現中的泛型約束,使之更通用。

    但是我們也應該注意到,如果T為結構體,那么由于T很大,所以裝箱拆箱反而也許是個更耗費效率的事情,因此,個人建議,對值類型慎用Lazy<T>。

    B. 線程安全的控制

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

    public enum LazyThreadSafetyMode
    {
    None,
    PublicationOnly,
    ExecutionAndPublication
    }
    不做多余解釋,關于這三者的具體意思,MSDN中已經說的很清楚了,可參加 這里 。

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

    5. 完善的大對象解決方案

    在 Anytao 文章的回復中,我就提到了一點是:

    個人倒覺得Lazy+WeakReference才是實現一個大對象的完整解決之道,一個按需加載,一個不定清理.....
    加到一起才完美。

    但是 老趙 說:

    又不是所有的大對象都需要自動清理……

    那么我就不再重復去總結了,這兩句話加到一起,我想應該可以得出一個比較完善的大對象處理方案吧。

    如果這樣,我們是否能對應地去創建一個單獨的實現類:WeakLazy<T>呢。

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

    6. 總結

    原本想寫一些稍微深入點的東西,可是寫到最后,發現仍為皮毛而,嘆乎……

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>