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



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



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



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


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



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

546   12  

12 ответов:

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

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

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

if (nullableBool.GetValueOrDefault(false)) {
}

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

if (x.HasValue && x.Value)

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

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

if (x ?? false)

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

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

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
}

просто подумайте о Буле? как имеющий 3 значения, то все становится проще:

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

давайте проверим, как определяется сравнение с 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) ...

на самом деле я думаю, что (nullableBool ?? false) является законным вариантом, особенно когда вы пытаетесь оценить нулевой bool в linq.

например:
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)

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

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

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

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

дано перечисление

public enum PublishMode { Edit, View }

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

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

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

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

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

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

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

Comments

    Ничего не найдено.