我想知道对可空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)样式…
(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)
当前回答
我想这取决于你。我当然认为.HasValue方法更具可读性,特别是对于不熟悉??语法。
可空布尔类型的另一点是,它是三态的,所以当它只是空时,而不是默认为false时,您可能想做一些其他事情。
其他回答
让我们检查一下如何定义与null的比较:
static void Main()
{
Console.WriteLine($"null != null => {null != null}");
Console.WriteLine($"null == null => {null == null}");
Console.WriteLine($"null != true => {null != true}");
Console.WriteLine($"null == true => {null == true}");
Console.WriteLine($"null != false => {null != false}");
Console.WriteLine($"null == false => {null == false}");
}
结果是:
null != null => False
null == null => True
null != true => True
null == true => False
null != false => True
null == false => False
所以你可以安全地使用:
// check if null or false
if (nullable != true) ...
// check if null or true
if (nullable != false) ...
// check if true or false
if (nullable != null) ...
鉴于枚举
public enum PublishMode { Edit, View }
你可以像这样做
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
实际上我认为(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)
我想这取决于你。我当然认为.HasValue方法更具可读性,特别是对于不熟悉??语法。
可空布尔类型的另一点是,它是三态的,所以当它只是空时,而不是默认为false时,您可能想做一些其他事情。
如果你无法控制条件的一部分是否检查一个空值,你总是可以尝试以下方法:
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
//perform your actions if true
}
我知道在if语句中放入三元并不是一种纯粹的方法,但它确实清晰地解决了这个问题。
这当然是手动的GetValueOrDefault(false)