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

Fir*_*ake 187 c# coding-style nullable

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

以下是编码风格的好坏吗?有没有办法更好/更干净地表达条件?

bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
Run Code Online (Sandbox Code Playgroud)

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

(不确定之前是否问过这个问题......找不到与搜索类似的内容)

Art*_*aru 328

我想很多人都专注于这个值可以为空的事实,并且不考虑他们真正想要的东西:)

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null
Run Code Online (Sandbox Code Playgroud)

或者如果你想要更多选择......

bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null
Run Code Online (Sandbox Code Playgroud)

(nullableBool == true)如果布尔将永远不会返回真实?为空:P

  • 我没有意识到可空比较像这样有意义。详细信息可以在 https://msdn.microsoft.com/en-us/library/2cf62fcy.aspx 上找到 (6认同)
  • [文档](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types)的相关部分:`对于相等运算符 ==,如果两个操作数都为 null,则结果为 true;如果只有一个操作数为 null,则结果为 false;否则,将比较操作数所包含的值。 (2认同)

Luc*_*ero 68

如何使用GetValueOrDefault,它非常自我解释并允许使用您想要的任何默认值:

if (nullableBool.GetValueOrDefault(false)) {
}
Run Code Online (Sandbox Code Playgroud)

  • 根据上下文,这种方法可能会抛出`System.NotSupportedException:LINQ to Entities无法识别方法'Boolean GetValueOrDefault()'方法,并且此方法无法转换为商店表达式. (3认同)
  • 我喜欢这种方法,因为它也适用于非if语句(即赋值)。 (3认同)

Dan*_*plo 44

你可能不喜欢它,但我个人觉得

if (x.HasValue && x.Value)
Run Code Online (Sandbox Code Playgroud)

最具可读性的.它清楚地表明您正在使用可空类型,并且它清楚地表明您首先检查可空类型是否具有值,然后有条件地对其进行操作.

如果你使用你的版本并用x替换变量,它会读取:

if (x ?? false)
Run Code Online (Sandbox Code Playgroud)

那是清楚的吗?显然x是可以为空的类型吗?我会让你决定.

  • 通过"可空类型"我的意思是System.Nullable类型.任何引用类型都可以为null.此外,如果您需要使用变量类型作为其名称的一部分,那么这表明您的代码不清楚. (5认同)

Ode*_*ded 21

如果你想把a null视为false,那么我会说最简洁的方法是使用null coalesce operator(??),如你所描述的:

if (nullableBool ?? false) { ... }
Run Code Online (Sandbox Code Playgroud)


And*_*lov 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
}
Run Code Online (Sandbox Code Playgroud)

  • 在最后两个方法中可能缺少分号(;)(即IsNull和IsNotNull) (2认同)

小智 8

想想布尔?因为有3个值,事情会变得更容易:

if (someNullableBool == true)     // only if true
if (someNullableBool == false)    // only if false
if (someNullableBool == null)     // only if null
Run Code Online (Sandbox Code Playgroud)


Zze*_*Zze 8

实际上,我认为这(nullableBool ?? false)是一个合理的选择,尤其是当您尝试在 linq 中评估可为空的 bool 时。

例如:

array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
Run Code Online (Sandbox Code Playgroud)

在我看来更清洁,而不是:

array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
Run Code Online (Sandbox Code Playgroud)


小智 5

让我们检查如何定义与 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}");
    }
Run Code Online (Sandbox Code Playgroud)

结果是:

null != null  => False                                                                                                                                                                                                                                  
null == null  => True                                                                                                                                                                                                                                   
null != true  => True                                                                                                                                                                                                                                   
null == true  => False                                                                                                                                                                                                                                  
null != false => True                                                                                                                                                                                                                                   
null == false => False
Run Code Online (Sandbox Code Playgroud)

所以你可以安全地使用:

// check if null or false
if (nullable != true) ...

// check if null or true
if (nullable != false) ...

// check if true or false
if (nullable != null) ...
Run Code Online (Sandbox Code Playgroud)


Vla*_*nov 5

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

if (nullableBool is true) {}
if (nullableBool is false) {}
if (nullableBool is null) {}
Run Code Online (Sandbox Code Playgroud)

与 operator 不同==,在阅读代码时,这会将可空类型检查与普通的“有味道的代码”区分开来。