0

我有一个要使用的伪实时数据处理应用程序,LazyInit<double>因此我不进行不需要的计算,而是LazyInit<T>将 T 限制为类。我可以解决它,但我显然不希望这样做。

有人知道这是为什么吗?

4

3 回答 3

4

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

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

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

---joe duffy,pfx 开发主管

于 2008-12-28T23:06:38.487 回答
2

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

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

于 2008-11-07T18:46:48.297 回答
0

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

LazyInit<double?>
于 2008-11-07T17:51:40.467 回答