Лучший способ проверить наличие nullable bool в выражении условия (если …)
мне было интересно, какой был самый чистый и понятный синтаксис для выполнения проверки условий на nullable bools.
следующий хороший или плохой стиль программирования? Есть ли способ выразить состояние лучше / более чисто?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
особенно если (nullableBool ?? ложь) часть. Мне не нравится if (x.HasValue && x.Value) стиль ...
(не уверен, что вопрос был задан раньше ... не удалось найти что-то подобное с поиск)
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