Existe uma diferença entre os dois seguintes pedaços de código?
class Test {
public readonly double Val;
public Test(bool src) {
this.Val = src ? 1 : 0;
}
}
class Test {
public readonly double Val;
public Test(bool src) {
this.Val = src ? 1D : 0D;
}
}
Eu descobri que nossa base de código usa a segunda maneira de escrever.
Respostas:
Há duas perguntas aqui e é importante observar que elas têm respostas diferentes.
Não. O compilador C # reconhece quando um literal inteiro é usado em um contexto em que um duplo é esperado e o tipo é alterado no tempo de compilação, portanto esses dois fragmentos geram o mesmo código.
Sim. A regra de que constantes inteiras são alteradas automaticamente para dobras se aplica apenas a constantes e
src ? ...
não é uma constante . O compilador irá gerar o primeiro como se você tivesse escrito:E o segundo como
Ou seja, no primeiro escolhemos um número inteiro e depois o convertemos para o dobro, e no segundo escolhemos um duplo.
FYI: o compilador C # ou o jitter têm permissão para reconhecer que o primeiro programa pode ser otimizado para o segundo, mas não sei se ele realmente o faz. Às vezes , o compilador C # move conversões para aritmética elevada nos corpos de condicionais; Escrevi esse código há oito anos, mas não me lembro de todos os detalhes.
fonte
Não é uma diferença no código IL gerado.
Esta aula:
Produz este código IL para o construtor:
E esta classe:
Produz este código IL para o construtor:
Como você pode ver, na primeira versão, é necessário chamar
conv.r8
para converter um int em um duplo.No entanto: (1) o resultado final é idêntico e (2) o compilador JIT pode muito bem converter esses dois no mesmo código de máquina.
Portanto, a resposta é: Sim, há é uma diferença - mas não aquele que você precisa para se preocupar.
Pessoalmente, eu optaria pela segunda versão, pois ela expressa melhor a intenção do programador e pode produzir código muito ligeiramente mais eficiente (dependendo do que o compilador JIT aprende).
fonte
Não há diferença, o compilador é inteligente o suficiente para fazer uma conversão implicitamente ou não.
No entanto, se você usar
var
, precisará escrevervar val = 42D;
para garantir que a variável seja dupla e não int.fonte