Nullables 和 Not .HasValue vs. IsNothing Nothing
Posted
技术标签:
【中文标题】Nullables 和 Not .HasValue vs. IsNothing Nothing【英文标题】:Nullables and Not .HasValue vs. IsNothing Nothing 【发布时间】:2022-01-20 12:33:13 【问题描述】:我在编写一些代码时遇到了一个“有趣”的难题,我无法找到充分的解释来解释为什么一个明显的“修复”实际上在原始代码不起作用的情况下起作用。
我有一个对象列表,其中包含相互依赖的相关计算,为了避免性能呈指数下降,我开始缓存一些键值(存储在 Nullable 中),这些键值可以回顾列表中的先前项目.为了清除缓存的值,我将它们设置为 Nothing,并有一些逻辑来检查它以便在更新需要时重新计算它们一次。
变量声明:
Dim _nullable As System.Decimal? = Nothing
原代码:
If (Not Me._nullable.HasValue OrElse Me.OtherCondition) Then
“固定”代码:
If (Me._nullable Is Nothing OrElse Not Me._nullable.HasValue OrElse Me.OtherCondition) Then
我对 .NET 的 Nullables 的了解表明,这两个条件在功能和逻辑上应该是相同的,但是将前者更改为后者修复了一个错误。
我没有看到的两种情况之间是否存在一些功能差异?
【问题讨论】:
我希望它们是等效的。您是否尝试过在调试器中单步执行代码以查看是否可以识别行为差异?您可能需要深入到反汇编级别才能看到差异。 是的,我通过了调试器。不幸的是,它没有清除任何东西。 你能显示更多代码吗?就像 _nullable 结构或类型是什么,它是如何设置的,以及设置它的方式。我猜有某种类型的拳击正在发生。 _nullable 被定义为 System.Decimal? (又名:System.NullableNot _nullable.HasValue
和 _nullable Is Nothing
编译为完全相同的 IL。
【参考方案1】:
随着更多调查变得很明显,我最初的问题的答案是,这两者确实彼此相同,而我的问题的原因是我似乎在不知不觉中追逐某种竞争条件.
谢谢大家的帮助。
【讨论】:
以上是关于Nullables 和 Not .HasValue vs. IsNothing Nothing的主要内容,如果未能解决你的问题,请参考以下文章
csharp 实现.AddOrUpdate也支持nullables
C# XmlSerializer DefaultAttribute 属性仍然为 nullables 序列化
nullable == null 和 nullable.hasvalue 之间有啥区别(如果有的话)[重复]
hystrix java.lang.NoSuchMethodError: rx.subjects.BehaviorSubject.hasValue()Z