2010-12-19 7 views
11

Dicen que la diferencia entre readonly y const es que const es tiempo de compilación (mientras que readonly es tiempo de ejecución). Pero, ¿qué significa exactamente eso, el hecho de que sea tiempo de compilación? Todo se compila en el código de bytes ¿no?¿Qué significa tiempo de compilación 'const'?

Respuesta

12

Simplemente significa que cada instancia del miembro marcado como const se reemplazará por su valor durante la compilación, mientras que los miembros de solo lectura se resolverán en tiempo de ejecución.

+1

fácil de entender la respuesta es lo que estaba buscando. gracias – foreyez

+3

También significa que las variables 'const' están limitadas a valores que pueden expresarse como literales en tiempo de compilación, sin objetos complejos. –

1

A const solo se puede definir durante su declaración. Un readonly se puede definir durante su declaración o en un constructor. Entonces, una variable readonly puede tener valores diferentes según el constructor utilizado para inicializarlo.

1

Normalmente, una "constante de tiempo de compilación" se refiere a un valor literal constante que el compilador resolvería. El código que genera el compilador tendrá el valor de intervalo disponible como un operando inmediato, en lugar de tener que cargarlo desde la memoria.

17

Significa que las variables const se escriben en la ubicación a la que se hace referencia. Así, supongamos que tiene un 2 bibliotecas, una con una variable const:

// Library A 
const int TEST = 1; 

// Library B 
void m() 
{ 
    Console.WriteLine(A.TEST); 
} 

La variable se escribe realmente, en tiempo de compilación, en B. La diferencia es que, si vuelve a compilar A pero no B, B tendrá el valor "antiguo". Esto no sucederá con las variables readonly.

2

Aunque la respuesta que proporcionó Julio es válida a partir de los efectos de establecer una variable como constante o de solo lectura, hay una gran diferencia entre las dos declaraciones.

Si bien muchas personas simplemente afirman que es obvio que el valor de una constante se resuelve en las compilaciones, mientras que un valor de solo lectura se resolverá solo durante el tiempo de ejecución, el punto principal reside donde se solicita la referencia.

Dependiendo del tipo de datos de la constante, será reemplazado en la evocación del comando, o almacenado en el HEAP y referenciado por un puntero.

Por ejemplo, el código:

const int x = 3; 
int y = 3 * x; 

puede ser resuelta en el tiempo de compilación como simplemente:

int y = 3 * 3; 

Por otro lado, un campo de sólo lectura es siempre almacenada en el STACK y referenciado por un puntero.

1

Una de las consecuencias del tiempo de compilación const es que los cambios en el const en un ensamblaje no se recogen automáticamente por otros ensamblajes sin recompilarlos todos.

Ej:

  1. Asamblea A tiene public const int = 10
  2. Asamblea B se refiere a la const.
  3. Ambos compilados. Ahora el conjunto A const cambió a 20, se volvió a implementar.
  4. Conjunto B no recompilado.

En tiempo de ejecución, la Asamblea B piensa que el valor de la const sigue siendo 10, no 20.

Si se tratara de sólo lectura, que recogería el nuevo valor.

Cuestiones relacionadas