¿Hay alguna diferencia entre las siguientes dos piezas 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;
}
}
Descubrí que nuestra base de código usa la segunda forma de escritura.
Respuestas:
Aquí hay dos preguntas y es importante tener en cuenta que tienen respuestas diferentes.
No. El compilador de C # reconoce cuándo se usa un literal entero en un contexto en el que se espera un doble y cambia el tipo en el momento de la compilación, por lo que estos dos fragmentos generarán el mismo código.
Si. La regla de que las constantes enteras se cambian automáticamente a dobles solo se aplica a las constantes , y
src ? ...
no es una constante . El compilador generará el primero como si usted hubiera escrito:Y el segundo como
Es decir, en el primero elegimos un número entero y luego lo convertimos a doble, y en el segundo elegimos un doble.
FYI: el compilador de C # o el jitter pueden reconocer que el primer programa se puede optimizar en el segundo, pero no sé si realmente lo hace. El compilador de C # no se mueven a veces conversiones para levantado aritmética en los cuerpos de los condicionales; Escribí ese código hace unos ocho años, pero no recuerdo todos los detalles.
fuente
No es una diferencia en el código IL generado.
Esta clase:
Produce este código IL para el constructor:
Y esta clase:
Produce este código IL para el constructor:
Como puede ver, en la primera versión tiene que llamar
conv.r8
para convertir un int en un doble.Sin embargo: (1) El resultado final es idéntico y (2) el compilador JIT puede traducir ambos al mismo código de máquina.
Así que la respuesta es: Sí, no es una diferencia - pero no uno que tiene que preocuparse.
Personalmente, optaría por la segunda versión, ya que expresa mejor la intención del programador y puede producir un código muy, muy ligeramente más eficiente (dependiendo de lo que haga el compilador JIT).
fuente
No hay diferencia, el compilador es lo suficientemente inteligente como para hacer una conversión implícitamente o no.
Sin embargo, si usa
var
, debe escribirvar val = 42D;
para asegurarse de que la variable sea doble y no int.fuente