我想知道对可空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)样式…
(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)
当前回答
鉴于枚举
public enum PublishMode { Edit, View }
你可以像这样做
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
其他回答
我认为很多人都专注于这个值是可空的,而没有考虑他们真正想要的是什么:)
bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null
或者如果你想要更多的选择…
bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null
(nullableBool == true)将永远不会返回true如果bool?null:P
如何使用GetValueOrDefault,这是非常自我解释的,并允许使用任何你想要的默认值:
if (nullableBool.GetValueOrDefault(false)) {
}
另一种方法是使用常量模式匹配:
if (nullableBool is true) {}
if (nullableBool is false) {}
if (nullableBool is null) {}
与操作符==不同,在读取代码时,这将把可空类型检查与普通的“有味道的代码”区分开来。
鉴于枚举
public enum PublishMode { Edit, View }
你可以像这样做
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
使用扩展。
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
}