LazyInitializerLazy<T>类之间有什么区别?
我知道他们俩只会按需初始化对象。
我什么时候需要使用它们?

最佳答案

Lazy<T>(MSDN)是一个通用包装器,它允许通过持有T工厂方法(T)并在访问Func<T>属性getter时对其进行调用来按需创建Vaue实例。
LazyInitializer-带有一组静态方法的静态类,这只是一个使用Activator.CreateInstance()(反射)能够实例化给定类型实例的助手。它不保留任何本地私有(private)字段,也不公开任何属性,因此不占用内存。

值得注意的是,这两个类都使用Func<T>作为实例工厂。

MSDN用几句话介绍oj​​it_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/

10-10 18:17