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

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

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

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

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

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

185
задан FireSnake 19 April 2010 в 22:26
поделиться

7 ответов

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

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

326
ответ дан 23 November 2019 в 05:52
поделиться

Возможно, вам это не понравится, но лично я считаю

if (x.HasValue && x.Value)

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

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

if (x ?? false)

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

44
ответ дан 23 November 2019 в 05:52
поделиться

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

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

0
ответ дан 23 November 2019 в 05:52
поделиться

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

if (nullableBool ?? false) { ... }
21
ответ дан 23 November 2019 в 05:52
поделиться

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

if (nullableBool.GetValueOrDefault(false)) {
}
68
ответ дан 23 November 2019 в 05:52
поделиться

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

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
}
8
ответ дан 23 November 2019 в 05:52
поделиться

Для данного перечисления

public enum PublishMode { Edit, View }

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

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

//or
       if (mode?? PublishMode.Edit == someValue)
       ....
    }
0
ответ дан 23 November 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: