延遲加載(lazy loading) 設計模式是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據(讀取屬性值)的時候,才真正執行數據加載操作.
為了便于理解, 我們來建立一個場景, 假設我們要構造一個Hero(英雄) 類, 每個Hero 有自己的名字和(SpecialSkill)特殊技能.
建模
這是一種建立的方法:
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> 以前我們可以這樣做:
}
}
非常好! 這就是我們要的效果, 這樣可以讓系統更加的有效率.
Lazy<T>
當net framework 引入了Lazy<T> 類后, 我們也可以使用它來實現:
public Hero(string name)
{
Name = name;
FullName = "Super " + name;
skill = new Lazy<SpecialSkill>(() => new SpecialSkill(name));
}
}
新聞熱點
疑難解答