Eu queria saber qual era a sintaxe mais limpa e compreensível para fazer verificações de condição em bools anuláveis.
O seguinte estilo de codificação é bom ou ruim? Existe uma maneira de expressar a condição melhor / mais limpa?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
especialmente a parte if (nullableBool ?? false) . Eu não gosto do if (x.HasValue && x.Value)
estilo ...
(não tenho certeza se a pergunta foi feita antes ... não foi possível encontrar algo semelhante com a pesquisa)
c#
coding-style
nullable
FireSnake
fonte
fonte
Que tal usar GetValueOrDefault , que é bastante autoexplicativo e permite usar o padrão que você deseja:
fonte
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Você pode não gostar, mas pessoalmente acho
o mais legível. Isso deixa claro que você está trabalhando com um tipo anulável e deixa claro que você está primeiro verificando se o tipo anulável tem um valor antes de agir condicionalmente.
Se você pegar sua versão e substituir a variável por x, também será exibido:
Isso é tão claro? É óbvio que x é um tipo anulável? Eu vou deixar você decidir.
fonte
x
é bom no contexto e às vezes é mais limpo; saber:var openOrders = orders.Where(x=>x.Open ?? false)
Se você deseja tratar a
null
como false, então eu diria que a maneira mais sucinta de fazer isso é usar o operador de coalescência nula (??
), como você descreve:fonte
Basta pensar em bool? como tendo 3 valores, as coisas ficam mais fáceis:
fonte
Use extensões.
fonte
null
comotrue
?Vamos verificar como a comparação com nulo é definida:
e os resultados são:
Então você pode usar com segurança:
fonte
if(nullable)...else if(!nulllable)...else..
Na verdade, acho que
(nullableBool ?? false)
é uma opção legítima, especialmente quando você está tentando avaliar um bool anulável no linq.Por exemplo:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
É mais limpo na minha opinião, em oposição a:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
fonte
Se você quiser apenas para teste
true
contra onull
/false
, único que eu acabo usado e lê muito bem éfonte
Eu acho que depende de você. Eu certamente acho que a abordagem .HasValue é mais legível, especialmente com desenvolvedores não familiarizados com o ?? sintaxe.
O outro ponto de um tipo booleano anulável é que ele é tristate; portanto, você pode fazer outra coisa quando for apenas nulo e não usar como padrão false.
fonte
Dado enum
você pode fazer isso aqui
fonte
nullable boolean
.Se você estiver em uma situação em que não tem controle sobre se parte da condição está verificando um valor anulável, sempre pode tentar o seguinte:
Eu sei que não é exatamente uma abordagem purista colocar um ternário em uma declaração if, mas resolve o problema de maneira limpa.
Esta é, obviamente, uma maneira manual de dizer
GetValueOrDefault(false)
fonte