Лучший способ проверить nullable bool в выражении условия (если...)

Мне было интересно, какой был самый чистый и понятный синтаксис для выполнения проверки условий на nullable bools.

Является ли следующий хороший или плохой стиль кодирования? Есть ли способ выразить состояние лучше/более чисто?

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

особенно if (nullableBool?? false). Мне не нравится стиль if (x.HasValue && x.Value)...

(не уверен, был ли задан вопрос раньше... не удалось найти что-то похожее на поиск)

Ответ 1

Я думаю, что многие люди концентрируются на том, что это значение является нулевым, и не думайте о том, чего они действительно хотят:)

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, если bool? имеет значение null: P

Ответ 2

Как насчет использования GetValueOrDefault, который довольно самоочевиден и позволяет использовать все, что вы хотите:

if (nullableBool.GetValueOrDefault(false)) {
}

Ответ 3

Вам может не понравиться, но лично я нахожу

if (x.HasValue && x.Value)

наиболее читаемый. Это дает понять, что вы работаете с типом NULL, и он дает понять, что вы сначала проверяете, имеет ли тип с нулевым значением значение, прежде чем действовать на него условно.

Если вы берете свою версию и заменяете переменную x, она также читает:

if (x ?? false)

Это ясно? Очевидно ли, что x - тип с нулевым значением? Я позволю тебе решить.

Ответ 4

Если вы хотите рассматривать null как false, то я бы сказал, что наиболее краткий способ сделать это - использовать оператор null coalesce (??), как вы описали:

if (nullableBool ?? false) { ... }

Ответ 5

Используйте расширения.

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
}

Ответ 6

Позволяет проверить, как определено сравнение с нулем:

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 значения, тогда все становится проще:

if (someNullableBool == true)     // only if true
if (someNullableBool == false)    // only if false
if (someNullableBool == null)     // only if null

Ответ 8

Если вы хотите протестировать только true против null/false, один, который я только что использовал и хорошо читаю,

bool? someCondition = null
if (someCondition.Equals(true))
...

Ответ 9

Я думаю, что это зависит от вас. Я, конечно, считаю, что подход .HasValue более читабельен, особенно с разработчиками, не знакомыми с?? синтаксис.

Другая точка с нулевым булевым типом состоит в том, что она тристата, поэтому вы можете захотеть сделать что-то еще, когда она просто равна null, а не по умолчанию false.

Ответ 10

Учитывая перечисление

public enum PublishMode { Edit, View }

вы можете сделать это, как здесь

 void MyMethod(PublishMode? mode)
    {
       var publishMode = mode ?? PublishMode.Edit;

//or
       if (mode?? PublishMode.Edit == someValue)
       ....
    }

Ответ 11

Если вы находитесь в ситуации, когда у вас нет контроля над тем, проверяет ли часть условия значение с нулевым значением, вы всегда можете попробовать следующее:

if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
    //perform your actions if true
}

Я знаю, что это не совсем пуристский подход, ставящий тройку в оператор if, но это решительно решает проблему.

Это, конечно, ручной способ сказать GetValueOrDefault(false)