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

下面的编码风格是好还是坏?有没有更好/更清楚地表达这种情况的方法?

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

特别是if (nullableBool ??假)的部分。我不喜欢if (x.HasValue && x.Value)样式…

(不确定以前是否有人问过这个问题……在搜索中找不到类似的东西)


当前回答

我想这取决于你。我当然认为.HasValue方法更具可读性,特别是对于不熟悉??语法。

可空布尔类型的另一点是,它是三态的,所以当它只是空时,而不是默认为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
}

另一种方法是使用常量模式匹配:

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

让我们检查一下如何定义与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( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

我知道在if语句中放入三元并不是一种纯粹的方法,但它确实清晰地解决了这个问题。

这当然是手动的GetValueOrDefault(false)