在 C# 中,懒加载(Lazy Loading)是一种设计模式,用于推迟对象的初始化,直到首次使用该对象时才进行创建。这种方式可以提升程序性能,避免不必要的资源占用。从 .NET Framework 4.0 开始,C# 提供了内置的 Lazy<T> 类,简化了懒加载的实现。
Lazy<T> 类的使用
Lazy<T> 类位于 System 命名空间下,允许我们定义一个延迟初始化的对象。在首次访问该对象的 Value 属性时,才会触发对象的创建。
代码示例:
using System;
public class ExpensiveResource
{
public ExpensiveResource()
{
Console.WriteLine("ExpensiveResource 被创建");
}
public void DoWork()
{
Console.WriteLine("ExpensiveResource 正在工作");
}
}
public class Program
{
private static Lazy<ExpensiveResource> lazyResource = new Lazy<ExpensiveResource>();
public static void Main(string[] args)
{
Console.WriteLine("程序开始");
// 在此之前,ExpensiveResource 尚未被创建
lazyResource.Value.DoWork();
// ExpensiveResource 已被创建,直接使用
lazyResource.Value.DoWork();
Console.WriteLine("程序结束");
}
}
输出结果:
程序开始
ExpensiveResource 被创建
ExpensiveResource 正在工作
ExpensiveResource 正在工作
程序结束
在上述示例中,ExpensiveResource 的实例仅在首次访问 lazyResource.Value 时被创建。后续对 lazyResource.Value 的访问将直接使用已创建的实例。
Lazy<T> 线程安全
默认情况下,Lazy<T> 是线程安全的。这意味着即使在多线程环境中,Lazy<T> 也能确保对象仅被初始化一次。如果需要自定义线程安全行为,可以使用不同的 LazyThreadSafetyMode 枚举值进行配置。
代码示例:
private static Lazy<ExpensiveResource> lazyResource = new Lazy<ExpensiveResource>(LazyThreadSafetyMode.ExecutionAndPublication);
Lazy<T> 应用场景
- 资源密集型对象:对于创建成本高或占用大量内存的对象,使用懒加载可以避免在未使用时占用系统资源。
- 提高程序启动性能:将某些对象的初始化延迟到实际需要时,可以加快程序的启动速度。
总而言之,Lazy<T> 类为 C# 开发者提供了一种简洁且高效的方式来实现懒加载,帮助优化应用程序的性能和资源管理。