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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top