【问题标题】:Lazy initialization延迟初始化
【发布时间】:2014-05-05 07:23:34
【问题描述】:

我想知道Lazy<T> 类的两个构造函数重载有什么区别。

Lazy(Func, Boolean) - 初始化一个新的 Lazy 实例 班级。发生延迟初始化时,指定的初始化 使用函数和初始化模式。

Lazy(Func, LazyThreadSafetyMode) - 初始化一个新的实例 使用指定初始化函数的惰性类和 线程安全模式。

从线程安全的角度来看,第二个构造函数是否更灵活?哪个LazyThreadSafetyMode 成员与Lazy<...>(..., true) 类似?

【问题讨论】:

    标签: c# .net lazy-initialization


    【解决方案1】:

    来自反射器:

    public Lazy(Func<T> valueFactory, bool isThreadSafe) : this(valueFactory, isThreadSafe ?LazyThreadSafetyMode.ExecutionAndPublication : LazyThreadSafetyMode.None)
    {
    }
    

    因此,如果您传递true,它将转换为LazyThreadSafetyMode.ExecutionAndPublication

    false 将转换为 LazyThreadSafetyMode.None

    顺便说一句,如果你只传递值因子(完全省略布尔值),它使用LazyThreadSafetyMode.ExecutionAndPublication

    【讨论】:

    【解决方案2】:

    如果您传递true,则使用ExecutionAndPublication 惰性模式初始化对象。如果您传递false,则使用None 模式初始化对象。

    如果您使用不带布尔值的重载,则使用 ExecutionAndPublication 模式进行初始化。

    【讨论】:

    • 哦,马修更快,发现的方法相同——我也使用了 Resharper,但不敢在这里发布反汇编代码 :-)
    • 我认为发布它是可以的 - 毕竟,它都可以在这里免费在线获得:referencesource.microsoft.com
    猜你喜欢
    • 2020-05-10
    • 2011-11-17
    • 1970-01-01
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2012-07-27
    相关资源
    最近更新 更多