【问题标题】:Why is LazyInit<T> restricted to reference types为什么 LazyInit<T> 仅限于引用类型
【发布时间】:2008-11-07 17:48:16
【问题描述】:

我有一个伪实时数据处理应用程序,我想在其中使用LazyInit&lt;double&gt;,所以我不进行不需要的计算,但LazyInit&lt;T&gt; 将 T 限制为类。我可以解决它,但我显然不想这样做。

有人知道这是为什么吗?

【问题讨论】:

    标签: .net .net-3.5 parallel-extensions


    【解决方案1】:

    我们当前(预览)位仅提供 LazyInit 类型,并且正如您所观察到的(并且 JaredPar 正确诊断)我们将 T 限制为引用类型,以便我们可以:(i)使 LazyInit 成为结构,并且(ii)提供合理的通过 CMPXCHG 的默认行为(即,我们可以检查“null”以表示没有值)。我们本可以使 T 不受限制,但决定针对常见情况进行优化——否则将意味着一些额外的字节;信不信由你,这可能使这种类型对某些人来说过于昂贵。

    我们最近稍微改变了路线。我们目前计划提供一个 LazyInit 类型,其中 T 不受限制除了,还有一个 LazyInitField 类型,其中 T 限制为引用类型。前者是大多数人会使用的,但后者可以用于那些有perf-conscious并且可以忍受T限制的人。

    希望这可以解决问题。干杯,

    ---joe duffy,pfx 开发主管

    【讨论】:

      【解决方案2】:

      原因是在 LazyInit 中选择底层 API。它使用 Interlocked.CompareExchange 来设置线程安全值。 CompareExchange 而泛型被限制为仅使用类类型。因此 LazyInit 的 T 值也必须是一个类。

      你可以在这里查看实现:LazyInit

      【讨论】:

        【解决方案3】:

        我相信这是因为值类型是自动初始化的,而 LazyInit 会根据它是否为空来确定是否需要初始化。您可以通过使用可为空的类型来解决它。

        LazyInit<double?>
        

        【讨论】:

        • 如果有一个 T : 类约束,那么它不会被可空值类型满足。
        • 除非 nullable 也在约束中,不是吗?
        猜你喜欢
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 2012-11-05
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多