我想知道对可空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)样式…
(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)
当前回答
你可能不喜欢,但我个人觉得
if (x.HasValue && x.Value)
最易读。它清楚地表明,您正在使用一个可空类型,并且清楚地表明,在有条件地对可空类型进行操作之前,您首先检查该可空类型是否有值。
如果你把你的版本用x替换变量,它也是:
if (x ?? false)
清楚吗?显然x是一个可空类型吗?我会让你决定的。
其他回答
如果你无法控制条件的一部分是否检查一个空值,你总是可以尝试以下方法:
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
//perform your actions if true
}
我知道在if语句中放入三元并不是一种纯粹的方法,但它确实清晰地解决了这个问题。
这当然是手动的GetValueOrDefault(false)
使用扩展。
public static class NullableMixin {
public static bool IsTrue(this System.Nullable<bool> val) {
return val == true;
}
public static bool IsFalse(this System.Nullable<bool> val) {
return val == false;
}
public static bool IsNull(this System.Nullable<bool> val) {
return val == null;
}
public static bool IsNotNull(this System.Nullable<bool> val) {
return val.HasValue;
}
}
Nullable<bool> value = null;
if(value.IsTrue()) {
// do something with it
}
想想bool?如果有3个值,事情就会变得简单:
if (someNullableBool == true) // only if true
if (someNullableBool == false) // only if false
if (someNullableBool == null) // only if null
如果你想把null值处理为false,那么我会说最简洁的方法是使用null联合运算符(??),正如你所描述的:
if (nullableBool ?? false) { ... }
鉴于枚举
public enum PublishMode { Edit, View }
你可以像这样做
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}