É ruim para aglutinar o avaliador em uma expressão ternária? (C #)
-
13-09-2019 - |
Pergunta
Eu olhei ao redor um pouco e não ter encontrado uma pergunta equivalente.
É este mau codificação prática? I pode lê-lo facilmente, mas é muito críptica para alguém ler o código?
bool? testBool = null;
string result;
result = (testBool ?? false ? "Yes" : "No");
Editar: As minhas desculpas a todos por algum código horrível! Aqui está um exemplo de trabalho ..
Eu estou um pouco sobrecarregado pela velocidade das respostas. Eu estava indo para eliminar este e fazer o certo, mas já tinha 4 respostas!
Solução
Eu adicionaria parens de modo a esclarecer o que está acontecendo -. Ie
bool? testbool = null;
string result;
result = (testbool ?? false) ? "Yes" : "No";
Com isso, eu estaria bem com ele. Sem ele, eu tive que estudá-lo um pouco para descobrir o que estava acontecendo (mesmo se ele compila - eu não sei a ordem das operações fora do topo da minha cabeça para:? Vs. ??)
Outras dicas
É um pouco no lado enigmática, não é mesmo óbvio, se a expressão é avaliada como:
string result = (testbool ?? false) ? "Yes" : "No";
ou
string result = testbool ?? (false ? "Yes" : "No");
Você pode usar o método GetValueOrDefault
do tipo anulável em vez do operador ??
para torná-lo mais legível:
bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");
EDIT: A pergunta original usou um int?
. Ele agora foi corrigido.
Esse código não vai mesmo compilar, então sim, eu diria que é muito enigmática.
Typos à parte, o fato de que você postou-lo sem facilmente manchas que há um problema (você está tentando usar um bool
no RHS da ??, quando o LHS é uma int?
) sugere que não é uma boa idéia, mesmo quando você obtê-lo direito.
Eu precisaria ver um exemplo do mundo real, mas eu acho que eu normalmente dividir isso em uma declaração utilizando o nulo coalescentes operador, e depois outro usando o operador condicional. Outra opção é usar o comportamento de tipos anuláveis ??em relação aos operadores ... mas, novamente, isso é razoavelmente obscurecer. (Eu apenas tinha que me lembrar exatamente o que o comportamento é!)
Eu gosto do nulo coalescentes operador em geral, mas acho que combinando-a com o operador condicional apenas torna um pouco para obscurecer. Eu acho que provavelmente teria aceito-o num caso em que houve um benefício significativo para que seja uma única expressão (por exemplo, para a inicialização, onde a alternativa é a introdução de um método extra), mas em geral eu prefiro dividi-lo em duas declarações.
EDIT: Uma alternativa em este caso particular é apenas para comparar contra o "verdadeiro" - que parece redundante, mas não é, no caso de bool?
:
result = (testBool == true) ? "Yes" : "No";
Os colchetes não são necessários, é claro, mas adicionar clareza IMO.
Eu acho que isso é mais simples: o resultado é apenas "Sim" se testBool
é realmente verdade; caso contrário, é "Não". Se você quisesse "default" como Sim, você escreveria:
result = (testBool == false) ? "No" : "Yes";
envolvê-la e eu acho que é bom.
string result = (testbool ?? false) ? "Yes" : "No";
Caso contrário, a ordem pretendida de operações, mesmo se ele funciona, não é óbvio.
(Edit:. Jonathan me bater por uma pitada)
que não deveria ser
bool? testbool = null;
?
Eu não encontro nenhuma necessidade de usar um anulável aqui. Isto faz-me pensar duas vezes, então eu realmente código-lo como
bool testbool = false;
string result;
result = testbool ? "Yes" : "No";
Eu não sei se o seu exemplo foi incompleta, mas acho que inicializar a variável para o valor padrão é mais saudável do que usar um nulo e, em seguida, a ?? operador para definir o valor após a declaração.