Я задавался вопросом, что было самым чистым и понятным синтаксисом для того, чтобы сделать, условие проверяет nullable bools.
Следующий хороший или плохой стиль кодирования? Существует ли способ выразить условие лучше/больше чисто?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
особенно, если (nullableBool?? ложь) часть. Мне не нравится if (x.HasValue && x.Value)
стиль...
(не уверенный, задали ли вопрос прежде..., не мог бы найти что-то похожим с поиском),
Я думаю, что многие люди концентрируются на том факте, что это значение допускает значение 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
Возможно, вам это не понравится, но лично я считаю
if (x.HasValue && x.Value)
наиболее читаемым. Он проясняет, что вы работаете с типом, допускающим значение NULL, и дает понять, что вы сначала проверяете, имеет ли тип, допускающий значение NULL, значение, прежде чем действовать на него условно.
Если вы возьмете свою версию и замените переменную на x, она также прочитает:
if (x ?? false)
Это так ясно? Очевидно ли, что x является типом, допускающим значение NULL? Я позволю тебе решать.
Думаю, решать вам. Я определенно считаю подход .HasValue более читабельным, особенно разработчикам, не знакомым с ?? синтаксис.
Другая особенность логического типа, допускающего значение NULL, заключается в том, что он имеет трехсторонний характер, поэтому вы можете сделать что-то еще, когда он имеет значение NULL, а не значение по умолчанию false.
Если вы хотите рассматривать null
как ложное, то я бы сказал, что самый краткий способ сделать это - использовать нулевой оператор объединения ( ??
), как вы описываете:
if (nullableBool ?? false) { ... }
Как насчет использования GetValueOrDefault , который довольно самоочевиден и позволяет использовать любое значение по умолчанию, которое вы хотите:
if (nullableBool.GetValueOrDefault(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
}
Для данного перечисления
public enum PublishMode { Edit, View }
вы можете сделать это, как здесь
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}