我有一个要使用的伪实时数据处理应用程序,LazyInit<double>
因此我不进行不需要的计算,而是LazyInit<T>
将 T 限制为类。我可以解决它,但我显然不希望这样做。
有人知道这是为什么吗?
我有一个要使用的伪实时数据处理应用程序,LazyInit<double>
因此我不进行不需要的计算,而是LazyInit<T>
将 T 限制为类。我可以解决它,但我显然不希望这样做。
有人知道这是为什么吗?
我们当前的(预览版)位仅提供 LazyInit 类型,并且正如您所观察到的(并且 JaredPar 正确诊断)我们将 T 限制为引用类型,以便我们可以:(i)使 LazyInit 成为结构,并且(ii)通过提供合理的默认行为CMPXCHG(即,我们可以检查“null”以表示没有值)。我们本可以使 T 不受限制,但决定针对常见情况进行优化——否则将意味着一些额外的字节;信不信由你,这可能使这种类型对某些人来说过于昂贵。
我们最近稍微改变了路线。除了T 限制为引用类型的 LazyInitField 类型之外,我们目前计划提供 T 不受限制的 LazyInit 类型。前者是大多数人会使用的,但后者可以用于那些有perf-conscious并且可以忍受T限制的人。
希望这可以解决问题。干杯,
---joe duffy,pfx 开发主管
原因是 LazyInit 中的底层 API 选择。它使用 Interlocked.CompareExchange 来设置线程安全值。CompareExchange 而泛型被限制为仅使用类类型。因此 LazyInit 的 T 值也必须是一个类。
你可以在这里查看实现:LazyInit
我相信这是因为值类型会自动初始化,并且 LazyInit 会根据它是否为空来确定是否需要初始化。您可以通过使用可为空的类型来解决它。
LazyInit<double?>