为什么LazyInit <t>仅限于引用类型</t>

时间:2008-11-07 17:48:17

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

我有一个伪实时数据处理应用程序,我想使用LazyInit<double>所以我不做我不需要的计算,但是LazyInit<T>将T限制为类。我可以解决它,但我显然不愿意。

有人知道这是为什么吗?

3 个答案:

答案 0 :(得分:4)

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

我们最近稍微改变了路线。我们目前计划提供一种LazyInit类型,其中T不受限制以及到LazyInitField类型,其中T仅限于引用类型。前者是大多数人会使用的,但后者可以用于那些具有敏感性且可以忍受T限制的人。

希望这可以解决问题。欢呼声,

--- joe duffy,pfx dev lead

答案 1 :(得分:2)

原因是LazyInit中的底层API选择。它使用Interlocked.CompareExchange来执行线程安全值集。 CompareExchange虽然泛型被限制为仅使用类类型。因此,LazyInit的T值也必须是一个类。

您可以在此处查看实施:LazyInit

答案 2 :(得分:0)

我认为这是因为值类型是自动初始化的,并且LazyInit根据它是否为null来确定某些内容是否需要初始化。你可以通过使用可空类型来绕过它。

LazyInit<double?>