使用数字,它总是相同漂亮:
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:这可能看起来像基于意见的问题,但我没有发现类似于单独清除我所有的疑虑......也许其中一些最适合在某些情况下使用,我想知道在哪些情况下
答案 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 */ }
我认为“丑陋”的东西最容易理解。
可空值通常是linq查询的结果,使用??
会增加不必要的复杂性来了解情况。
比较
if(Items?.Any(o => o.IsSelected) == true)
vs
if(Items?.Any(o => o.IsSelected) ?? false)
第一个更易于阅读,只需检查是否选择了任何项目即可。
当我的(可能是未经训练的?)心读到后者时,我必须在??
处进行心理句号停止,进行反转,然后我才知道何时执行if
块。使用??
时,如果经过足够的时间,快速浏览别人的代码甚至我自己的代码,我可能会犯一个错误。