我想知道对可空bool进行条件检查最干净,最易理解的语法是什么。
以下编码风格是好还是坏?有没有办法更好/更清洁地表达条件?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
尤其是 if(nullableBool ?? false)部分。我不喜欢if (x.HasValue && x.Value)
风格......
(不确定之前是否提出过问题......无法找到与搜索类似的内容)
答案 0 :(得分:300)
我认为很多人都专注于这个值可以为空的事实,而不考虑他们真正想要的东西:)
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
如果bool, (nullableBool == true)
将永远不会返回true?为空:P
答案 1 :(得分:61)
如何使用GetValueOrDefault,这是非常自我解释并允许使用您想要的任何默认值:
if (nullableBool.GetValueOrDefault(false)) {
}
答案 2 :(得分:37)
你可能不喜欢它,但我个人认为
if (x.HasValue && x.Value)
最具可读性。它清楚地表明你正在使用可空类型,它清楚地表明你首先检查可空类型是否具有值,然后有条件地对其进行操作。
如果您使用您的版本并将变量替换为x,则会显示:
if (x ?? false)
那是否清楚?显然x是可以为空的类型吗?我会让你决定。
答案 3 :(得分:17)
如果您想将null
视为false,那么我会说最简洁的方法是使用null coalesce运算符(??
),如您所述:
if (nullableBool ?? false) { ... }
答案 4 :(得分:8)
使用扩展程序。
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
}
答案 5 :(得分:8)
想到布尔?如果有3个值,事情会变得更容易:
if (someNullableBool == true) // only if true
if (someNullableBool == false) // only if false
if (someNullableBool == null) // only if null
答案 6 :(得分:3)
让我们检查如何定义与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) ...
答案 7 :(得分:3)
实际上我认为(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)
答案 8 :(得分:1)
如果您只想针对true
/ null
对false
进行测试,那么我刚刚使用并且读得很好的是
bool? someCondition = null
if (someCondition.Equals(true))
...
答案 9 :(得分:0)
我认为这取决于你。我当然认为.HasValue方法更具可读性,特别是对于不熟悉的开发人员而言。语法。
可以为空的布尔类型的另一点是它是三态的,所以当它只是null时你可能想要做其他事情,而不是默认为false。
答案 10 :(得分:0)
给定枚举
public enum PublishMode { Edit, View }
你可以像这里一样
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
答案 11 :(得分:0)
如果您处于无法控制部分条件是否正在检查可空值的情况下,您可以尝试以下操作:
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
//perform your actions if true
}
我知道这并不是一种纯粹主义的方法,在if语句中加入三元组,但确实可以彻底解决问题。
这当然是一种说法GetValueOrDefault(false)
答案 12 :(得分:0)
另一种方法是使用constant pattern matching:
if (nullableBool is true) {}
if (nullableBool is false) {}
if (nullableBool is null) {}
与运算符==
不同,在读取代码时,这会将可空类型检查与普通的“带有异味的代码”区分开来。