<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      不可不知的C#基礎 4. 延遲加載 -- 提高性能

      延遲加載(lazy loading) 設計模式是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據(讀取屬性值)的時候,才真正執行數據加載操作.

      有效使用它可以大大提高系統性能.

       

      為了便于理解, 我們來建立一個場景, 假設我們要構造一個Hero(英雄) 類, 每個Hero 有自己的名字和(SpecialSkill)特殊技能.

      建模

      這是一種建立的方法:

      public class Hero
      {
      public string FullName { get; set; }
      public string Name { get; set; }
      public SpecialSkill Skill{ get; set; }

      public Hero(string name)
      {
      Name = name;
      FullName = "Super " + name;
      Skill = new SpecialSkill(name);
      }
      }
      public class SpecialSkill
      {
      public int Power { get; set; }
      public string SkillName { get; set; }
      public int StrengthSpent { get; set; }
      public SpecialSkill(string name)
      {
      Console.WriteLine("loading special skill .....");
      Power = name.Length;
      StrengthSpent = name.Length * 3;
      SkillName = name + " Blazing";
      Console.WriteLine(SkillName + ",... this's what makes a legend!");
      }
      }
      class Program
      {
      static void Main(string[] args)
      {
      Hero hero = new Hero("wukong");
      Console.WriteLine("\n\n.......................Press Enter to continue.......................\n\n");
      Console.Read();
      Console.WriteLine("Hero's special skill: " + hero.Skill.SkillName);
      Console.Read();
      Console.Read();
      }
      }
       
       
      運行程序后輸出如下, 這個例子非常的容易理解, 結果也是顯然的.

      ScreenShot066

       

      它的缺點是, 當運行Hero 構造函數的時候, SpecialSkill 的所有屬性都已經加載了. 如果我們只想獲取這個Hero 的FullName, 我們也加載了SpecialSkill 所有值.

       

      屬性的加載延遲

      在沒有Lazy<T> 以前我們可以這樣做:

       
      public class Hero
      {
      public string FullName { get; set; }
      public string Name { get; set; }
      private SpecialSkill skill;
      public SpecialSkill Skill
      {
      get { return skill ?? (skill = new SpecialSkill(Name)); }
      }
      public Hero(string name)
      {
      Name = name;
      FullName = "Super " + name;


      }
      }

      即: 修改屬性SpecialSkill的加載方法. 那么當我們再運行程序時, 得到的輸出就是:

      ScreenShot067

       

      非常好! 這就是我們要的效果, 這樣可以讓系統更加的有效率.

       

      Lazy<T>

      當net framework 引入了Lazy<T> 類后, 我們也可以使用它來實現:

      public class Hero
      {
      public string FullName { get; set; }
      public string Name { get; set; }

      private readonly Lazy<SpecialSkill> skill;
      public SpecialSkill Skill
      {
      get { return skill.Value; }
      }

      public Hero(string name)
      {
      Name = name;
      FullName = "Super " + name;

      skill = new Lazy<SpecialSkill>(() => new SpecialSkill(name));
      }
      }

      Lazy<T>提供對延遲初始化的支持。而 Lazy<T> 中的一個屬性 Value, 則是獲取當前 Lazy<T> 實例的延遲初始化值。

       

      Lazy<T>的優勢

      那么既然我們已經可以用屬性緩存的方法實現, 為什么還要引入Lazy<T> ?

      至少Lazy<T> 有以下幾點優勢:

      1. 它具有 LazyThreadSafetyMode, 但是我們一般不使用它, 除非是很關鍵的情況下(在此略去181個字)
      2. 它使屬性的定義行更加簡單
      3. 從語義上來講, 它更加明確, 更加具有可讀性
      4. 它允許null為有效值

      本文來自于喜樂的ASP.NET(Alex Song) 轉貼請注明出處

      一些相關文章:

      不可不知的C#基礎 1. -- Extension 擴展方法

      不可不知的C#基礎 2. -–從 struct 和 class的異同 說開去

      不可不知的C#基礎 3. 線程淺析

      posted @ 2011-11-24 04:41  擁有的都是恩典  閱讀(13241)  評論(26)    收藏  舉報
      主站蜘蛛池模板: 潼关县| 亚洲欧洲一区二区天堂久久| 亚洲旡码欧美大片| 国产无遮挡裸体免费视频在线观看| 亚洲欧美电影在线一区二区| 最新国产精品拍自在线观看| 亚洲色精品VR一区二区三区| 龙门县| 亚洲精品一区二区在线播| 99国产欧美另类久久久精品| 视频一区视频二区在线视频| 国产播放91色在线观看| 天堂久久天堂av色综合| 久久精品一本到99热免费| 久久国产免费观看精品3| 99国产欧美另类久久久精品| 日本公与熄乱理在线播放| 日韩av第一页在线播放| 国内自拍视频一区二区三区| 国产一区二区日韩在线| av无码精品一区二区三区宅噜噜| 久久国产乱子精品免费女| 日本一区二区三区在线看| 3d动漫精品一区二区三区| 亚洲肥熟女一区二区三区| 亚洲高清国产自产拍av| 久久精品国产亚洲夜色av| 国产色精品久久人妻| 中国国产免费毛卡片| 精品国产一区av天美传媒| 固始县| 亚洲丰满熟女一区二区蜜桃| 成全影院电视剧在线观看| 亚洲成av人片不卡无码手机版| 精品一区二区中文字幕| 亚洲 一区二区 在线| 成人亚洲a片v一区二区三区动漫| 免费国产一区二区不卡| 国产精品一码在线播放| 亚洲欧洲日产国产av无码| 天天做天天爱夜夜爽女人爽|