2010-01-13 14 views
26

¿Cómo declarar una constante local en C#?¿Cómo declarar una constante local en C#?

Al igual que en Java, puede hacer lo siguiente:

public void f(){ 
    final int n = getNum(); // n declared constant 
} 

Cómo hacer lo mismo en C#? Intenté con readonly y const, pero ninguno parece funcionar.

Cualquier ayuda sería muy apreciada.

Gracias.

+11

Esta es la omisión más molesta de C# en mi corto tiempo de uso. Utilizo const en variables locales en C++ todo el tiempo por mi propia seguridad, cordura y legibilidad. – pauldoo

+0

http://stackoverflow.com/questions/443687/why-does-c-sharp-disallow-readonly-local-variables –

+0

@MauricioScheffer, gracias por el enlace. Aunque ahora, si tengo que escribir algo para .NET, seguramente utilizaré F #. :-) – missingfaktor

Respuesta

19

En C#, no puede crear una constante que se recupera de un método.

Editar: vínculo roto http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

Este documento debería ayudar: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

Una expresión constante es una expresión que se puede evaluar plenamente en tiempo de compilación.

+14

Bueno, eso apesta. :/ –

+5

Brutal. No solo debería ser compatible, debería ser el predeterminado. – andyczerwonka

+0

'final' y' const' tienen diferentes significados. En C#, se debe conocer un valor 'const' en tiempo de compilación. El verdadero problema es que C# no admite las variables locales 'readonly', lo cual es una lástima porque sería útil. – Nick

6

No estoy seguro de por qué readonly y const no funcionaron para usted ya que estas son las palabras clave que necesita. Usted utilizar const si tiene un literal (a excepción de literales de matriz) y readonly lo contrario:

public void f() 
{ 
    const int answer = 42; 
} 

private readonly int[] array = new int[] { 1, 2, 3, 4 }; 
private readonly DateTime date = DateTime.Now; 
public void g() 
{ 
    Console.WriteLine(date.ToString()); 
} 

readonly sólo funciona en el nivel de clase (es decir, sólo se puede aplicar a los campos). También como consecuencia de const que requiere un literal, es inherentemente estático mientras que un campo readonly puede ser estático o de instancia.

+2

Es importante tener en cuenta que crear una instancia de solo lectura de un tipo de referencia solo significa que la referencia en sí misma no se puede cambiar; el objeto todavía puede modificarse normalmente (a menos que el tipo sea inmutable, como String). –

+3

La respuesta a ** su ** pregunta es simple: ninguno de ellos (const, readonly) funcionaría en un ejemplo dado. – greenoldman

1

La palabra clave const se utiliza para modificar una declaración de un campo o local variable.

De MSDN.

Dado que C# no puede imponer "const correctnes" (como C++) de todos modos, no creo que sea muy útil. Dado que las funciones son muy limitadas, es fácil no perder la supervisión.

+0

Debo señalar, sin embargo, que eric dahlvang aún tiene razón sobre por qué const no funcionó en su caso. –

+0

"Debido a que las funciones son muy limitadas, es fácil no perder la supervisión". - ¿Por qué otros lenguajes como C++ y Java proporcionan ese mecanismo entonces? – missingfaktor

+0

No sé acerca de Java, pero C++ puede aplicar true const también en referencias, lo que C# no puede. Nunca he visto que const se use localmente en ningún otro lugar que no sea en C++. –

1

En el ejemplo que proporcionó, debe declarar la variable como static, porque la está inicializando con una llamada a un método. Si se estaba inicializando con un valor constante, como 42, puede usar const. Para clases, estructuras y matrices, readonly debería funcionar.

+7

Tenga en cuenta que no puede usar variables estáticas en solo miembros. –

9

Declara tu variable local como una variable de iteración. Las variables de iteración son de solo lectura (No solicitó una solución bonita).

public void f() 
{ 
    foreach (int n in new int[] { getNum() }) // n declared constant 
    { 
    n = 3; // won't compile: "error CS1656: Cannot assign to 'n' because it is a 'foreach iteration variable'" 
    } 
} 
+3

Es bueno saberlo, pero Dios lo promete, no va a hacer eso nunca. – missingfaktor

+0

Eso es oro) Este truco es tan feo que ni siquiera lo pensé. Definitivamente lo usaré (como un fragmento) para verificar mi código, ya sabes, cambiando temporalmente 'var index = GetNum()' to 'foreach' para forzar al compilador a verificar mi código. –

+0

omg. Todavía estoy golpeando mi cabeza sobre la mesa ya que estoy considerando seriamente usar este truco. ¡Qué sucio realmente ;-) –

2

Hay una especie de solución que requiere ReSharper. No se puede obtener solo locales, pero al menos se pueden detectar mutados y colorearlos de forma diferente.

Utilice el elemento Fonts and Colors Resharper Identificador de variable local mutable.

Para mí, tengo lugareños de color gris, y luego elegí un blanco en negrita para las variables mutadas (esto es con un tema oscuro). Esto significa que cualquier variable que se escribe en más de una vez aparece brillante en comparación con las regulares. Luego puede hacer lo que pueda para evitar tener una variable mutada, o si el método realmente lo requiere, al menos estará resaltado.

+0

No funciona para mí. Solo muestra los contadores de bucle como inmutables, todo lo demás es mutable, sin importar cuántas escrituras. Supongo que mi Resharper es demasiado viejo :-) –

+0

@ Xan-KunClark-Davis no muestra lo que es mutable, muestra lo que está mutado. todo lo que se escribe exactamente una vez se verá normal. todo lo que se escribe dos veces o más se resaltará. (oh, supongo que dijiste "no importa cuántas escrituras"). ¿Estás seguro? algo como 'int x = 5; x = 3; ', x debería cambiar el color. Supongo que podría ser la versión, sí. –

+0

@ Sahuagin Sí, entiendo la parte que tienes que invertir, todos los lugareños se destacan y todas las mutables se vuelven "normales" otra vez, pero aún así, no cambia el color. Intentaré con un proyecto limpio nuevamente. –

Cuestiones relacionadas