LazyInitializer和Lazy<T>类之间有什么区别?
我知道他们俩只会按需初始化对象。
我什么时候需要使用它们?
最佳答案
Lazy<T>
(MSDN)是一个通用包装器,它允许通过持有T
工厂方法(T
)并在访问Func<T>
属性getter时对其进行调用来按需创建Vaue
实例。LazyInitializer
-带有一组静态方法的静态类,这只是一个使用Activator.CreateInstance()(反射)能够实例化给定类型实例的助手。它不保留任何本地私有(private)字段,也不公开任何属性,因此不占用内存。
值得注意的是,这两个类都使用Func<T>
作为实例工厂。
MSDN用几句话介绍ojit_code类:
PS:
我发现一种有趣的方式LazyInitializer
检查实例是否已初始化,它只是将传入的引用与LazyIntiializer
进行比较,很好:
private static T EnsureInitializedCore<T>(ref T target, Func<T> valueFactory)
where T : class
{
T t = valueFactory();
if (t == null)
{
throw new InvalidOperationException(Environment.GetResourceString("Lazy_StaticInit_InvalidOperation"));
}
Interlocked.CompareExchange<T>(ref target, t, default(T));
return target;
}
对我来说似乎很奇怪,它在每次实际检查之前都会创建一个新实例:
T t = valueFactory();
// ... and only then does check
关于c# - LazyInitializer与Lazy <T>类。何时使用每个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12007267/