Você está escrevendo uma expressão booleana que pode ser assim:
team.Category == "A Team" && team?.Manager?.IsVietnamVet
public class Manager
{
public bool IsVietnamVet { get; set; }
}
public class Team
{
public string Category { get; set; }
public Manager Manager { get; set; }
}
... e você recebe um erro:
O operador '&&' não pode ser aplicado a operandos do tipo 'bool' e 'bool?'
Qual é a maneira ideal / mais limpa de lidar com isso?
team.Category == "A Team" && (team?.Manager?.IsVietnamVet ?? false)
Isso é realmente legível?
team.Category == "A Team" && (team?.Manager?.IsVietnamVet).GetValueOrDefault()
Pode não funcionar no LINQ-to-Entities ...
team.Category == "A Team" && team?.Manager?.IsVietnamVet == true
Você realmente escreveria
if (condition == true)
sem hesitar?
Existem outras opções? Em última análise, é melhor escrever:
team.Category == "A Team" && team.Manager != null && team.Manager.IsVietnamVet
team.Manager?.IsVietnamVet
, ou seja, nenhuma condição nula depoisteam
, pois já não pode sernull
.nullableBool == true
é basicamente testando paranullableBool != false && nullableBool != null
(e é esta segunda parte que faz com que seja útil e, portanto, não supérfluo)nullableBool == true
se não criar um invólucro. É legível porque você normalmente não escreve== true
ao usar booleano regular como o @Flater menciona, portanto, sugere que a variável é anulável. Além disso, melhora a legibilidade do LINQ porque você não usa várias condições nulas, como o @Fabio menciona.Respostas:
Nesse caso em particular, pode ser prudente seguir a Lei de Deméter, ou seja,
De maneira mais geral, se uma expressão booleana é complexa ou feia, não há nada a dizer que você não possa dividi-la (ou parte dela) em uma declaração separada:
Ao percorrer o código no depurador, geralmente é melhor ter condições elaboradas agrupadas em um único
bool
apenas para economizar um pouco de pairar o mouse; de fato, pode ser melhor colocar a coisa toda em umabool
variável.ou com LINQ:
fonte
a && b && c &&...
é executado sequencialmente, e o próximo nem é executado se o anteriorfalse
. Então, as pessoas costumam colocar mais rápido no começo. Tenha isso em mente quando se deslocam coisas em separado bool-varIsManagerVietnamVet
imóvel vai verificar numa base de dados;)Eu acho que a opção 3 (ie
== true
) é a maneira mais limpa de teste que umbool?
étrue
, porque é muito claro sobre o que ele faz.Na maioria dos códigos
x == true
, não faz sentido, porque é o mesmo quex
, mas isso não se aplica aqui, então acho== true
que não seria muito confuso.fonte
a?.b == true
que ficará confuso, mas depois de entender o que está fazendo, torna-se um idioma muito legível, muito mais agradável do que ter que testar!= null
no meio de uma expressão complexa. O mesmo paraa?.b ?? false
, que parece ter ganhado força como a solução mais popular, porque corresponde ao que você digitaria se estivesse lidando com um tipo diferente de booleano [embora eu não goste de booleano; para mim, não parece tão natural; Eu prefiro== true
]Expandindo a resposta de Ben Cottrell, o padrão "Objeto nulo" pode ajudá-lo ainda mais.
Em vez de retornar uma
null
equipe / gerente, extraiaITeam
e façaIManager
interfaces e retorne implementações alternativas significativas:De repente, você pode fazer
team.ManagedByVietnamVet
com segurança.Obviamente, isso depende do provedor upstream
team
como sendo seguro para nulos - mas isso pode ser garantido com testes apropriados.fonte
Eu escrevi uma classe simples que você poderia usar:
Se for confiável usar um tipo personalizado, é claro. Você pode comparar
MyBool
com ambosbool
eNullable<bool>
.fonte