布尔?与bool vs GetValueOrDefault vs ??相比较操作者

时间:2015-11-16 13:35:43

标签: c# nullable

使用数字,它总是相同漂亮

if(a < 123) { ... } // disregards if `b` is `int?` or `int`

但是bool?

bool? b = ...
if(b) { ... } // compiler error: can't convert bool? to bool.

有以下选项:

if(b == false) { ... } // looks ugly, comparing bool? with bool
if(b.GetValueOrDefault()) { ... } // unclear when condition is true (one must know it's `false`)
if(b.GetValueOrDefault(true)) { ... } // required few seconds to understand inversion

无论何时(至少bool?)都应该使用这种语法总是

if(b ?? false) { ... } // looks best to me
PS:这可能看起来像基于意见的问题,但我没有发现类似于单独清除我所有的疑虑......也许其中一些最适合在某些情况下使用,我想知道在哪些情况下

3 个答案:

答案 0 :(得分:7)

语言设计者有两种选择,只要允许bool?参与需要bool的控制语句的控制表达式:

  • 允许它,并在null治疗
  • 时作出任意决定
  • 禁止它,强迫您在每次相关时做出决定。

请注意,设计师对if(a < 123)语句的问题要少得多,因为“否”是问题的有效答案“null小于123”,“是null大于123“,”null等于123“,依此类推。

if (b ?? false)if (b ?? true)是非常方便的结构,可让您向读者解释您的代码和编译器以何种方式处理存储在其中的null bool?变量。

答案 1 :(得分:4)

每当我看到某人使用可以为空的布尔bool?时,我会问他们为什么。通常,答案是 - “好吧,我不是很确定”。它实际上创建了一个三态条件,在我看来,无论如何都会使代码难以阅读。 null是什么意思,如果它总是假的,那么为什么要首先让它成为 nullable 呢?

但是为了更直接地回答你的问题,我更喜欢

if (b ?? false)

上的

语法

if (b.GetValueOrDefault())

答案 2 :(得分:1)

几年后,根据个人经验,我可以说出以下语法显然是赢家:

if(b == false) { /* do something if false */ }
if(b == true) { /* do something if true */ }
if(b != false) { /* do something if NOT false, means true or null */ }
if(b != true) { /* do something if NOT true, means false or null */ }

我认为“丑陋”的东西最容易理解。

== vs ??

可空值通常是linq查询的结果,使用??会增加不必要的复杂性来了解情况。

比较

if(Items?.Any(o => o.IsSelected) == true)

vs

if(Items?.Any(o => o.IsSelected) ?? false)

第一个更易于阅读,只需检查是否选择了任何项目即可。

当我的(可能是未经训练的?)心读到后者时,我必须在??处进行心理句号停止,进行反转,然后我才知道何时执行if块。使用??时,如果经过足够的时间,快速浏览别人的代码甚至我自己的代码,我可能会犯一个错误。

相关问题