2012-02-10 20 views
47

Mi código es el siguiente¿Por qué compilar el error "Uso de variable local no asignada"?

int tmpCnt; 
if (name == "Dude") 
    tmpCnt++; 

¿Por qué hay un error Use of unassigned local variable tmpCnt? Sé que no lo inicialicé explícitamente, pero debido a Default Value Table, se inicializó un tipo de valor con 0. La referencia también me recuerda:

Recuerde que no se permite el uso de variables no inicializadas en C#.

¿Pero por qué tengo que hacerlo explícitamente si ya está hecho por defecto? ¿No ganaría rendimiento si no tuviera que hacerlo? Sólo me preguntaba ...

+0

¿Alguien puede ayudarme con el título? No se pudo encontrar un ajuste para este: -S – theknut

+0

Tengo una estructura local, nunca inicializada, compila sin errores. Hoy creé una estructura diferente, tratada de manera idéntica, obtengo "error de variable local no inicializada". Todos sus * miembros * se establecieron en un valor antes del uso, pero no pude establecerlo en nulo, ya que era 'solo' una estructura. La estructura que compilaba contenía solo enteros, bools y cadenas. El que dio el error también contenía DateTimes. "MyStructType myStruct = new MyStructType();" mató el error. No es la primera vez que me muerde por perderme algunos niveles más abajo. – mickeyf

Respuesta

90

Las variables locales no se han inicializado. Tienes que inicializarlos manualmente.

miembros se inicializan, por ejemplo:

public class X 
{ 
    private int _tmpCnt; // This WILL initialize to zero 
    ... 
} 

Pero variables locales no son:

public static void SomeMethod() 
{ 
    int tmpCnt; // This is not initialized and must be assigned before used. 

    ... 
} 

lo que el código debe ser:

int tmpCnt = 0; 
if (name == "Dude") 
    tmpCnt++; 

Así que el largo y a falta de eso, los miembros se inicializan, los locales no. Es por eso que obtienes el error del compilador.

+4

¡Gracias! No sabía acerca de la diferencia en miembros y lugareños +1 – theknut

+1

@James: ¿sabe si esto es simplemente una característica del compilador para prevenir tal error, o si el compilador de C# realmente retrasa la asignación de memoria para los locales declarados hasta la asignación? (Por ejemplo, en C++, el uso de una variable no asignada es "aceptable" aunque el valor de dicha variable sea impredecible.) – ybakos

+2

Característica del compilador para evitar el error. La memoria (que por supuesto es solo una referencia para los tipos de referencia) para el local se asigna en la declaración. –

0

Consulte this thread sobre bools no inicializados, pero debería responder a su pregunta.

Las variables locales no se inicializan a menos que llame a sus constructores (nuevos) o les asigne un valor.

0

Las variables locales no se inicializan automáticamente. Eso solo ocurre con variables de nivel de instancia.

Debe inicializar explícitamente las variables locales si desea que se inicialicen. En este caso, (como explica la documentación vinculada) estableciendo el valor de 0 o utilizando el operador new.

El código que ha mostrado efectivamente intenta utilizar el valor de la variable tmpCnt antes de que se inicialice a algo, y el compilador advierte acertadamente al respecto.

0

La tabla de valores predeterminados solo se aplica a la inicialización de una variable.

por la página vinculada, los dos siguientes métodos de inicialización son equivalentes ...

int x = 0; 
int x = new int(); 

En el código, simplemente define la variable, pero nunca inicializar el objeto.

10

Las asignaciones predeterminadas se aplican a los miembros de la clase, pero no a las variables locales. Como Eric Lippert lo explicó en this answer, Microsoft podría tener locals inicializados de forma predeterminada, pero optaron por no hacerlo porque usar un local no asignado es casi seguro un error.

1

Si bien los tipos de valores tienen valores predeterminados y no pueden ser nulos, también deben inicializarse explícitamente para poder usarlos. Puedes pensar en estas dos reglas como reglas lado a lado. Los tipos de valor NO pueden ser nulos ==> el compilador garantiza eso. Si preguntas cómo? el mensaje de error que recibiste es la respuesta. Una vez que llamas a sus constructores, se inicializaron con sus valores predeterminados.

int tmpCnt; // not accepted 
int tmpCnt = new Int(); // defualt value applied tmpCnt = 0 
5

Las siguientes categorías de las variables se clasifican como inicialmente sin asignar:

  • variables de instancia de variables struct inicialmente sin asignar.
  • Parámetros de salida, incluida esta variable de constructores de instancias struct.
  • Variables locales, excepto las declaradas en una cláusula catch o en una declaración foreach.

Las siguientes categorías de las variables se clasifican como inicialmente asignados :

  • Las variables estáticas.
  • Variables de instancia de instancias de clase.
  • Variables de instancia de variables de estructura asignadas inicialmente.
  • Elementos de matriz.
  • Parámetros del valor.
  • Parámetros de referencia.
  • Variables declaradas en una cláusula catch o en una instrucción foreach.
0

variables locales no tienen un valor predeterminado.

Deben asignarse definitivamente antes de usarlos. Reduce la posibilidad de utilizar una variable a la que cree haber otorgado un valor razonable, cuando en realidad tiene algún valor predeterminado.

Cuestiones relacionadas