日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

不可不知的C#基础 4. 延迟加载 -- 提高性能

發(fā)布時間:2024/9/20 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不可不知的C#基础 4. 延迟加载 -- 提高性能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

有效使用它可以大大提高系統(tǒng)性能.

為了便于理解, 我們來建立一個場景, 假設(shè)我們要構(gòu)造一個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();
}
} 運行程序后輸出如下, 這個例子非常的容易理解, 結(jié)果也是顯然的.

它的缺點是, 當運行Hero 構(gòu)造函數(shù)的時候, SpecialSkill 的所有屬性都已經(jīng)加載了. 如果我們只想獲取這個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的加載方法. 那么當我們再運行程序時, 得到的輸出就是:

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

Lazy<T>

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

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>的優(yōu)勢

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

至少Lazy<T> 有以下幾點優(yōu)勢:

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

    以上是生活随笔為你收集整理的不可不知的C#基础 4. 延迟加载 -- 提高性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。