在条件表达式中检查可空bool的最佳方法(如果...)

时间:2010-04-20 09:26:14

标签: c# coding-style nullable

我想知道对可空bool进行条件检查最干净,最易理解的语法是什么。

以下编码风格是好还是坏?有没有办法更好/更清洁地表达条件?

bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }

尤其是 if(nullableBool ?? false)部分。我不喜欢if (x.HasValue && x.Value)风格......

(不确定之前是否提出过问题......无法找到与搜索类似的内容)

13 个答案:

答案 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 / nullfalse进行测试,那么我刚刚使用并且读得很好的是

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) {}

与运算符==不同,在读取代码时,这会将可空类型检查与普通的“带有异味的代码”区分开来。