麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

C#基礎 延遲加載介紹與實例

2020-01-24 03:25:26
字體:
來源:轉載
供稿:網友

延遲加載(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();
    }
}


運行程序后輸出如下, 這個例子非常的容易理解, 結果也是顯然的.

它的缺點是, 當運行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的加載方法. 那么當我們再運行程序時, 得到的輸出就是:

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

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> 有以下幾點優勢:
它具有 LazyThreadSafetyMode, 但是我們一般不使用它, 除非是很關鍵的情況下(在此略去181個字)
它使屬性的定義行更加簡單
從語義上來講, 它更加明確, 更加具有可讀性
它允許null為有效值

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品午夜未成人免费观看 | 欧美黄色大片免费观看 | 日韩视频精品一区 | chinese xxxx hd pron8 tube | 91九色网 | 中文字幕综合 | 美女一级毛片 | 又黄又爽免费无遮挡在线观看 | 色综合久久久久综合99 | 中文在线日韩 | 天堂精品久久 | 久久777国产线看观看精品 | 黄污网址| 国产一级免费av | 国产精品免费久久久 | 天天夜干 | 毛片在哪看 | 欧美a∨一区二区三区久久黄 | 国内精品久久久久久2021浪潮 | 欧美成人精品一区 | 337p粉嫩大胆噜噜噜亚瑟影院 | 久久久久久久亚洲精品 | 精品视频一区二区三区四区 | 在线成人影视 | 久精品久久 | 欧美一区二区三区免费观看 | 激情在线观看视频 | 日韩精品羞羞答答 | 国产一级一级片 | 亚洲国产美女视频 | 性爱视频免费 | 一级黄色a视频 | 秋霞a级毛片在线看 | 亚洲精品一区中文字幕 | h网站在线观看 | 啊~用cao嗯力cao烂我视频 | 天天骑夜夜操 | 在线成人免费观看 | 午夜小网站 | 免费观看9x视频网站在线观看 | 99精品视频在线免费观看 |