提问人:FireSnake 提问时间:4/20/2010 更新时间:10/27/2020 访问量:223552
检查条件表达式中可为 null 的布尔值的最佳方法(如果 ...)[已结束]
Best way to check for nullable bool in a condition expression (if ...) [closed]
问:
我想知道对可为 null 的布尔值进行条件检查的最干净、最易于理解的语法是什么。
以下编码风格是好是坏?有没有办法更好/更干净地表达病情?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
尤其是 if (nullableBool ?? false) 部分。我不喜欢这种风格......if (x.HasValue && x.Value)
(不确定之前是否问过这个问题......在搜索中找不到类似的东西)
答:
我认为这取决于你。我当然认为.HasValue 方法更具可读性,特别是对于不熟悉 ??语法。
可为 null 的布尔类型的另一点是它是三态的,因此当它只是 null 而不是默认为 false 时,您可能希望执行其他操作。
你可能不喜欢它,但我个人发现
if (x.HasValue && x.Value)
可读性最强。它清楚地表明您正在使用可为 null 的类型,并清楚地表明您首先检查可为 null 的类型是否具有值,然后再有条件地对它执行操作。
如果你采用你的版本并用 x 替换变量,它也会显示:
if (x ?? false)
有那么清楚吗?很明显 x 是可为 null 的类型吗?我会让你决定的。
评论
x
在上下文中很好,有时更干净;机智:var openOrders = orders.Where(x=>x.Open ?? false)
if (x ?? false)
= if(x==true)
.我喜欢“??”,但不喜欢布尔值。🙂
如果你想把 a 视为 false,那么我会说最简洁的方法是使用 null 合并运算符 (),如您所述:null
??
if (nullableBool ?? 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
}
评论
null
true
如何使用 GetValueOrDefault,这是不言自明的,并允许使用您想要的任何默认值:
if (nullableBool.GetValueOrDefault(false)) {
}
评论
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
给定枚举
public enum PublishMode { Edit, View }
你可以像这里一样做
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
评论
nullable boolean
我认为很多人都专注于这个值是可空的,而不考虑他们真正想要的是什么:)
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?为 null :P
评论
For the equality operator ==, if both operands are null, the result is true, if only one of the operands is null, the result is false; otherwise, the contained values of operands are compared.
(nullableBool == true)
null
false
&&
||
true
false
if (nullableBool) ...
如果您无法控制条件的一部分是否正在检查可为 null 值,则始终可以尝试以下操作:
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
//perform your actions if true
}
我知道这并不完全是一种纯粹的方法,将三元放在 if 语句中,但它确实干净地解决了这个问题。
当然,这是一种手动的说法GetValueOrDefault(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) ...
评论
if(nullable)...else if(!nulllable)...else..
想想布尔?由于有 3 个值,那么事情就变得更容易了:
if (someNullableBool == true) // only if true
if (someNullableBool == false) // only if false
if (someNullableBool == null) // only if null
如果你只想测试 / ,我刚刚使用并且读得很好的一个是true
null
false
bool? someCondition = null
if (someCondition.Equals(true))
...
评论
实际上,我认为这是一个合理的选择,尤其是当您尝试在 linq 中计算可为 null 的布尔值时。(nullableBool ?? false)
例如:
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)
评论
(nullableBool == true)
另一种方法是使用常量模式匹配:
if (nullableBool is true) {}
if (nullableBool is false) {}
if (nullableBool is null) {}
与运算符不同,在读取代码时,这将区分可为 null 的类型检查和普通的“带有气味的代码”。==
上一个:C# 获取用户输入并输出为布尔值
下一个:来自元组 C 的条件布尔检查#
评论