Con una gran cantidad de C++ fondo me he acostumbrado a escribir lo siguiente:CS0133 "La expresión asignada a 'identificador' debe ser constante" - ¿cuál es la razón detrás de eso?
const int count = ...; //some non-trivial stuff here
for(int i = 0; i < count; i++) {
...
}
y espera que el mismo habría ningún problema en C#. Sin embargo ...
byte[] buffer = new byte[4];
const int count = buffer.Length;
produce CS0133 de error: La frase siendo asignado a 'contar' debe ser constante.
No lo entiendo. ¿Por qué es eso inválido? int
es un tipo de valor, ¿verdad? ¿Por qué no puedo asignar un valor y hacer que la variable sea inmutable de esta manera?
¿Cuál es la limitación frente a lo que cabe esperar de const? Y uf, no estoy seguro de haber seguido la definición de Wikipedia de "const-correctness".¿Solo que usa const cuando sea apropiado? ¿Cómo funciona Readonly Bork esa corrección? – ruffin
@ruffin: en C#, const y readonly solo se puede aplicar a los miembros de la clase. En C++, const no significa "constante de tiempo de compilación", sino que "no se modificará". Puede tener métodos de miembros const (es decir, no modifican la clase de la que son miembros, por lo que si tiene un objeto const, solo puede invocar métodos const. Los parámetros de función pueden ser const, (otra vez) , lo que significa que la función que se está llamando no puede modificar los parámetros ni llamar a funciones miembro no constantes). – jalf
Esto le permite crear una noción de "const-correctness". Es decir, puede distinguir entre "modificar" y funciones "no modificables", y detectar en tiempo de compilación si accidentalmente intentas realizar una operación de modificación en un objeto const. Puedes definir una clase para limitar las operaciones que se pueden realizar si es const, y si lo haces de manera consistente a través de su programa, es const-correct. Cualquier intento de violación de constness "lógico" se convierte en un error en tiempo de compilación. – jalf