C#基礎 消極式載入介紹與執行個體

來源:互聯網
上載者:User

消極式載入(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為有效值

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.