C# Language const


Ejemplo

const se utiliza para representar valores que nunca cambiarán a lo largo de la vida útil del programa. Su valor es constante desde el tiempo de compilación , a diferencia de la palabra clave readonly , cuyo valor es constante desde el tiempo de ejecución.

Por ejemplo, dado que la velocidad de la luz nunca cambiará, podemos almacenarla en una constante.

const double c = 299792458;  // Speed of light

double CalculateEnergy(double mass)
{
    return mass * c * c;
}

Esto es esencialmente lo mismo que tener una return mass * 299792458 * 299792458 , ya que el compilador sustituirá directamente c con su valor constante.

Como resultado, c no se puede cambiar una vez declarado. Lo siguiente producirá un error en tiempo de compilación:

const double c = 299792458;  // Speed of light 

c = 500;  //compile-time error

Una constante se puede prefijar con los mismos modificadores de acceso que los métodos:

private const double c = 299792458;
public const double c = 299792458;
internal const double c = 299792458;

const miembros const son static por naturaleza. Sin embargo, el uso de static explícitamente no está permitido.

También puedes definir constantes locales de método:

double CalculateEnergy(double mass)
{
    const c = 299792458;
    return mass * c * c;
}

Estos no pueden ser prefijados con una palabra clave private o public , ya que son implícitamente locales al método en el que están definidos.


No todos los tipos se pueden utilizar en una declaración const . Los tipos de valores permitidos son los tipos predefinidos sbyte , byte , short , ushort , int , uint , long , ulong , char , float , double , decimal , bool y todos los tipos de enum . Intentar declarar miembros const con otros tipos de valor (como TimeSpan o Guid ) fallará en tiempo de compilación.

Para la string tipo de referencia predefinida especial, las constantes se pueden declarar con cualquier valor. Para todos los demás tipos de referencia, las constantes se pueden declarar, pero siempre deben tener el valor null .


Debido a que los valores const son conocidos en tiempo de compilación, se permiten como etiquetas de case en una declaración de switch , como argumentos estándar para parámetros opcionales, como argumentos para atribuir especificaciones, y así sucesivamente.


Si se utilizan valores const en diferentes ensamblajes, se debe tener cuidado con el control de versiones. Por ejemplo, si el ensamblaje A define una public const int MaxRetries = 3; , y el conjunto B usa esa constante, entonces si el valor de MaxRetries se cambia más tarde a 5 en el conjunto A (que luego se vuelve a compilar), ese cambio no será efectivo en el conjunto B a menos que el conjunto B también se vuelva a compilar (con Una referencia a la nueva versión de A).

Por esa razón, si un valor puede cambiar en futuras revisiones del programa, y ​​si el valor debe ser públicamente visible, no declare ese valor const menos que sepa que todos los conjuntos dependientes se volverán a compilar cada vez que se cambie algo. La alternativa es usar static readonly lugar de const , que se resuelve en tiempo de ejecución.