C# 的 Lazy<T> 類型
Lazy<T> 是 C# 中的一個類,用于實現延遲初始化(懶加載)模式。它提供了一種線程安全的方式來延遲創建大型或資源密集型對象,直到第一次實際需要時才進行初始化。
主要特點
-
延遲初始化:對象只有在第一次被訪問時才會創建
-
線程安全:默認情況下是線程安全的,可以確保在多線程環境中只初始化一次
-
性能優化:避免不必要的資源消耗,特別是對于可能不會使用的資源
基本用法
// 創建一個延遲初始化的對象
Lazy<ExpensiveObject> lazyObject = new Lazy<ExpensiveObject>();// 實際訪問時才會創建對象
ExpensiveObject obj = lazyObject.Value;
構造函數選項
-
無參數構造函數:使用類型的默認構造函數
Lazy<MyClass> lazy = new Lazy<MyClass>();
-
使用初始化函數:
Lazy<MyClass> lazy = new Lazy<MyClass>(() => new MyClass("param"));
-
指定線程安全模式:
// 非線程安全模式(性能更高,適用于單線程) Lazy<MyClass> lazy = new Lazy<MyClass>(LazyThreadSafetyMode.None);
實際應用場景
-
大型資源(如圖像、文件)的延遲加載
-
數據庫連接的延遲建立
-
計算密集型對象的延遲創建
-
依賴注入框架中的服務延遲實例化
示例
public class ExpensiveService
{public ExpensiveService(){Console.WriteLine("ExpensiveService created!");// 模擬耗時初始化Thread.Sleep(1000);}public void DoWork() => Console.WriteLine("Working...");
}class Program
{static void Main(){Lazy<ExpensiveService> lazyService = new Lazy<ExpensiveService>();Console.WriteLine("Lazy object created, but service not initialized yet");// 只有在訪問Value屬性時才會初始化lazyService.Value.DoWork();// 后續訪問不會重新初始化lazyService.Value.DoWork();}
}
輸出:
Lazy object created, but service not initialized yet
ExpensiveService created!
Working...
Working...
Lazy<T>?是優化應用程序性能和資源使用的重要工具,特別是在對象創建成本高但可能不需要的情況下。