Lazy
可能的兩個使用情境:
- 當建立某個物件會耗費大量資源,而程式可能不使用它時。
- 當建立某個物件會耗費大量資源,而您想要延遲到完成其他耗費資源的作業後,再建立它。
Lazy 簡單範例:
using System;
using System.Threading;
class Program
{
static void Main()
{
Lazy<string> lazyString = new Lazy<string>(() =>
{
Console.WriteLine("執行A計算...");
Thread.Sleep(2000);
return "這是A計算結果";
});
Console.WriteLine("執行B計算...");
// 等待兩秒
Thread.Sleep(2000);
// 使用 Lazy<T> 的值
Console.WriteLine(lazyString.Value);
Console.ReadLine();
}
}
在此範例中,我們創建了一個 Lazy
當我們執行這個範例時,它的輸出應該會如下所示:
執行B計算...
執行A計算...
這是A計算結果
可以看到, Lazy
物件的初始化被推遲到了需要使用其值時才執行。
值得注意的是, Lazy
Lazy Thread safe範例
以下是一個使用 Lazy
public class Singleton
{
private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton(), LazyThreadSafetyMode.ExecutionAndPublication);
private Singleton()
{
// 建構子為 private,以防止從外部實例化
}
public static Singleton Instance
{
get { return instance.Value; }
}
}
在上面的範例中,我們使用 Lazy
值得注意的是, Lazy
Lazy 的一些常用屬性和方法:
-
Value:用於獲取 Lazy
的值,如果 Lazy 還沒有初始化,則在第一次呼叫時會進行初始化。 -
IsValueCreated:用於檢查 Lazy
是否已經初始化。 -
LazyThreadSafetyMode:用於指定 Lazy
的執行緒安全性,有三個可選值:
- None:Lazy
不是執行緒安全的,這意味著多個執行緒可以同時訪問它,並導致一些問題,建議只有在確定只有一個執行緒會訪問該物件時使用此選項。 - PublicationOnly:Lazy
在初始化完成後變為執行緒安全,這意味著在初始化期間可能會有多個執行緒同時訪問該物件。 - ExecutionAndPublication:Lazy
在初始化期間和初始化完成後都是執行緒安全的,這意味著在初始化期間只有一個執行緒可以訪問該物件。
- Lazy
()建構子 :用於創建 Lazy物件,接受一個 Func 委託,該委託將在需要時執行以初始化 Lazy 。
如上述範例中,我們使用了 Lambda 表達式定義了一個 Func
委託,它將在需要時初始化 Lazy 。
具體來說,這個委託創建了一個新的 Singleton 物件,並將其作為 Lazy
小結
使用 Lazy