Мне было интересно, какой синтаксис был наиболее понятным и понятным для выполнения проверок условий на допускаемых значениях bools.
Это следующий хороший или плохой стиль кодирования? Есть ли способ выразить состояние лучше / чище?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
особенно часть if (nullableBool ?? false) . Мне не нравится if (x.HasValue && x.Value)
стиль ...
(не уверен, задавался ли вопрос раньше ... не смог найти что-то похожее с поиском)
c#
coding-style
nullable
FireSnake
источник
источник
Как насчет использования GetValueOrDefault , который довольно понятен и позволяет использовать любое значение по умолчанию:
источник
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Возможно, вам это не понравится, но лично я нахожу
самый читаемый. Это дает понять, что вы работаете с обнуляемым типом, и дает понять, что вы сначала проверяете, имеет ли обнуляемый тип значение, прежде чем воздействовать на него условно.
Если вы берете свою версию и заменяете переменную на x, она также гласит:
Это так ясно? Очевидно ли, что x это обнуляемый тип? Я позволю тебе решить.
источник
x
хорошо в контексте и иногда чище; для остроумия:var openOrders = orders.Where(x=>x.Open ?? false)
Если вы хотите трактовать a
null
как false, то я бы сказал, что наиболее краткий способ сделать это - использовать оператор null coalesce (??
), как вы описываете:источник
Просто подумай о буле? с 3 значениями все становится проще:
источник
Используйте расширения.
источник
null
какtrue
?Давайте проверим, как определяется сравнение с нулем:
и результаты:
Так что вы можете смело использовать:
источник
if(nullable)...else if(!nulllable)...else..
На самом деле, я думаю, что
(nullableBool ?? false)
это законный вариант, особенно когда вы пытаетесь оценить nullable 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
AGAINSTnull
/false
, Один я просто использовал и читает очень хорошо этоисточник
Я думаю, это до вас. Я, конечно, думаю, что подход .HasValue более читабелен, особенно с разработчиками, не знакомыми с ?? синтаксис.
Другой момент, допускающий использование булевого типа со значением NULL, состоит в том, что он является трехсторонним, поэтому вы можете захотеть сделать что-то еще, когда оно просто равно нулю и не по умолчанию равно false.
источник
Данное перечисление
Вы можете сделать это как здесь
источник
nullable boolean
.Если вы находитесь в ситуации, когда у вас нет контроля над тем, проверяет ли часть условия обнуляемое значение, вы всегда можете попробовать следующее:
Я знаю, что это не совсем пуристический подход, заключающийся в том, чтобы использовать троичное выражение if, но он решает проблему чисто.
Это, конечно, ручной способ сказать
GetValueOrDefault(false)
источник