2008-11-01 10 views
28

No estoy seguro de por qué obtengo este error, pero ¿no debería compilarse este código, dado que ya estoy verificando si la cola se está inicializando?Error de C#: uso de la variable local no asignada

public static void Main(String[] args) 
{ 
    Byte maxSize; 
    Queue queue; 

    if(args.Length != 0) 
    { 
     if(Byte.TryParse(args[0], out maxSize)) 
      queue = new Queue(){MaxSize = maxSize}; 
     else 
      Environment.Exit(0); 
    } 
    else 
    { 
     Environment.Exit(0); 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
     queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
     Console.WriteLine(queue.Remove()); 
} 

Así que si la cola no se ha inicializado, entonces el de bucles no son accesibles a la derecha? Dado que el programa ya termina con Environment.Exit (0)?

Esperanza YA'LL me puede dar algunos consejos :)

Gracias.

+6

No puedo darle ninguna indicación, pero espero que pueda obtener un control sobre esta. – wprl

Respuesta

73

El compilador no sabe que Environment.Exit() va a finalizar el programa; simplemente lo ve ejecutando un método estático en una clase. Simplemente inicialice queue para anular cuando lo declare.

Queue queue = null; 
9

El compilador no sabe que Environment.Exit() no devuelve. ¿Por qué no simplemente "regresar" desde Main()?

+0

Prefiero usar Environment.Exit con un estado de error distinto de cero en caso de que se llame al programa desde un script.De esta forma, el script puede saber si el programa fue exitoso o no al verificar el estado de salida. – tvanfosson

+4

Cambia el tipo de retorno de main a int y devuelve el estado. –

0

El compilador solo sabe que el código es o no alcanzable si utiliza "regresar". Piense en Environment.Exit() como una función a la que llama, y ​​el compilador no sabe que cerrará la aplicación.

+0

Puedo pensar en otras dos fuentes de código inalcanzable: Romper o continuar en un bucle, y lanzar :) –

+0

Eso es cierto. Me refería a esta pregunta específica, pero gracias por la aclaración, podría llevar a una mala interpretación. –

8

Un par de diferentes maneras de resolver el problema:

basta con sustituir Environment.Exit con retorno. El compilador sabe que la devolución finaliza el método, pero no sabe que Environment.Exit lo hace.

static void Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return; 
    } else { 
     return; 
} 

Por supuesto, realmente solo puede salirse con la suya porque está usando 0 como código de salida en todos los casos. Realmente, deberías devolver un int en lugar de usar Environment.Exit. Para este caso particular, este sería mi método preferido

static int Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return 1; 
    } else { 
     return 2; 
    } 
} 

Inicializar cola para nulo, lo que en realidad es sólo un truco compilador que dice: "Voy a entender mis propias variables sin inicializar, muchas gracias". Es un truco útil, pero no me gusta en este caso: tienes demasiadas ramas para verificar fácilmente que lo estás haciendo correctamente. Si realmente quería hacerlo de esta manera, algo como esto sería más claro:

static void Main(string[] args) { 
    Byte maxSize; 
    Queue queue = null; 

    if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) { 
    Environment.Exit(0); 
    } 
    queue = new Queue(){MaxSize = maxSize}; 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 

Añadir una instrucción de retorno después de Environment.Exit. Una vez más, esto es más de un truco compilador - pero es un poco más de fiar OMI, ya que añade la semántica para los seres humanos también (aunque él se puede mantener de esa cobertura cacareado código 100%)

static void Main(String[] args) { 
    if(args.Length != 0) { 
    if(Byte.TryParse(args[0], out maxSize)) { 
     queue = new Queue(){MaxSize = maxSize}; 
    } else { 
     Environment.Exit(0); 
     return; 
    } 
    } else { 
    Environment.Exit(0); 
    return; 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 
+0

Gracias por la publicación muy informativa. – jkidv

-4

con SqlConnection; SqlCommand com; con = new SqlConnection ("Fuente de datos =. \ SQLEXPRESS; AttachDbFilename =" + Server.MapPath ("~ \ App_Data \ Database.mdf") + "; Seguridad integrada = True; Instancia de usuario = True"); con.Open();

com = new SqlCommand("insert into blog values(@b)", con); 
    //com.Parameters.AddWithValue("@a", TextBox1.Text); 
    com.Parameters.AddWithValue("@b",TextBox2.Text); 
    com.ExecuteNonQuery(); 
    con.Close(); 
    TextBox1.Visible = true; 
    SqlDataReader DR1; 

    while (DR1.Read()) 
    { 
     TextBox1.Text = DR1[1].ToString(); 
    } 

viene el error que utiliza variables locales no asignadas.

Cuestiones relacionadas