Лучший способ проверить 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)