前言
按需加載物件延遲加載實際是推遲進行創建物件,直到對其呼叫后才進行創建初始化,延遲(懶加載)的好處是提高系統性能,避免不必要的計算以及不必要的資源浪費,
常規有這些情況:
- 物件創建成本高且程式可能不會使用它, 例如,假定記憶體中有具有 Orders 屬性的 Customer 物件,該物件包含大量 Order 物件,初始化這些物件需要資料庫連接, 如果用戶永遠不要求顯示 Orders 或在計算中使用該資料,則無需使用系統記憶體或計算周期來創建它, 通過使用 Lazy
來宣告 Orders物件用于遲緩初始化,可以避免在不使用該物件時浪費系統資源, - 物件創建成本高,且希望將其創建推遲到其他高成本操作完成后, 例如,假定程式在啟動時加載多個物件實體,但是只需立即加載其中一部分, 可以通過推遲初始化不需要的物件,直到創建所需物件,提升程式的啟動性能,(來源官方)
示例
創建用戶類
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public User() {
this.Name = "Name";
this.Age = 0;
}
}
默認情況下,Lazy
class Program
{
static void Main(string[] args)
{
Lazy<User> user = new Lazy<User>();
ThreadLocal<User> threadLocal = new ThreadLocal<User>();
if (!user.IsValueCreated)
Console.WriteLine("The object is not initialized");
Console.WriteLine(user.Value.Name);
user.Value.Name = "Name1";
user.Value.Age = 1;
Console.WriteLine(user.Value.Name);
Console.Read();
}
}
| 物件的執行緒安全性 | LazyThreadSafetyMode mode 引數 | 布爾 isThreadSafe 引數 | 沒有執行緒安全性引數 |
|---|---|---|---|
| 完全執行緒安全;一次只有一個執行緒嘗試初始化值, | ExecutionAndPublication | true | 可以, |
| 非執行緒安全, | None | false | 不適用, |
| 完全執行緒安全;執行緒爭用以初始化值, | PublicationOnly | 不適用, | 不適用, |
其中IsValueCreated屬性是個Boolean型別,我們可以通過此屬性去確定當前物件有沒有被初始化

呼叫后,進行了創建操作

再說說Lazy中幾個建構式,
-
public Lazy (bool isThreadSafe):
isThreadSafe 的布爾引數,該方法引數用于指定是否從多執行緒訪問 Value 屬性, 如果想要僅從一個執行緒訪問屬性,則傳入 false 以獲取適度的性能優勢, 如果想要從多執行緒訪問屬性,則傳入 true 以指示 Lazy實體正確處理爭用條件(初始化時一個執行緒引發例外), -
public Lazy (LazyThreadSafetyMode mode):提供執行緒安全模式,
-
public Lazy (Func
valueFactory) :
lambda 運算式傳遞給新的 Lazy物件的建構式, 下一次訪問 Value 屬性將導致新 Lazy 的初始化,并且其 Value 屬性此后會回傳已分配給該屬性的新值,
總結
參考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/94858.html
標籤:C#
上一篇:C#執行緒學習筆記四:執行緒同步
下一篇:你真的了解foreach嗎?
