我想知道对可空bool进行条件检查的最干净和最容易理解的语法是什么。
下面的编码风格是好还是坏?有没有更好/更清楚地表达这种情况的方法?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
特别是if (nullableBool ??假)的部分。我不喜欢if (x.HasValue && x.Value)样式…
(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)
我想知道对可空bool进行条件检查的最干净和最容易理解的语法是什么。
下面的编码风格是好还是坏?有没有更好/更清楚地表达这种情况的方法?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
特别是if (nullableBool ??假)的部分。我不喜欢if (x.HasValue && x.Value)样式…
(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)
当前回答
如何使用GetValueOrDefault,这是非常自我解释的,并允许使用任何你想要的默认值:
if (nullableBool.GetValueOrDefault(false)) {
}
其他回答
我想这取决于你。我当然认为.HasValue方法更具可读性,特别是对于不熟悉??语法。
可空布尔类型的另一点是,它是三态的,所以当它只是空时,而不是默认为false时,您可能想做一些其他事情。
如何使用GetValueOrDefault,这是非常自我解释的,并允许使用任何你想要的默认值:
if (nullableBool.GetValueOrDefault(false)) {
}
实际上我认为(nullableBool ??False)是一个合理的选项,特别是当你试图在linq中计算一个可为空的bool值时。
例如:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
在我看来更干净,而不是:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
另一种方法是使用常量模式匹配:
if (nullableBool is true) {}
if (nullableBool is false) {}
if (nullableBool is null) {}
与操作符==不同,在读取代码时,这将把可空类型检查与普通的“有味道的代码”区分开来。
如果你只想对null/false测试true,我刚刚使用的一个读起来很好
bool? someCondition = null
if (someCondition.Equals(true))
...