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.Nullable)。它位于 List 集合中的对象上,并且有一个方法将 '_nullable' 设置为 Nothing,该方法从该集合中调用以清除已编辑对象和列表中所有后续对象中的缓存值。这些都没有改变。 您的代码按预期工作:Demo 将其粘贴到 SharpLab 中表明 Not _nullable.HasValue_nullable Is Nothing 编译为完全相同的 IL。 【参考方案1】:

随着更多调查变得很明显,我最初的问题的答案是,这两者确实彼此相同,而我的问题的原因是我似乎在不知不觉中追逐某种竞争条件.

谢谢大家的帮助。

【讨论】:

以上是关于Nullables 和 Not .HasValue vs. IsNothing Nothing的主要内容,如果未能解决你的问题,请参考以下文章

csharp 实现.AddOrUpdate也支持nullables

C# XmlSerializer DefaultAttribute 属性仍然为 nullables 序列化

nullable == null 和 nullable.hasvalue 之间有啥区别(如果有的话)[重复]

C# HasValue vs !=null [重复]

hystrix java.lang.NoSuchMethodError: rx.subjects.BehaviorSubject.hasValue()Z

DateTime.hasvalue vs datetime == null,哪个更好以及为啥[重复]