C # Chyba: Použití nepřidělené lokální proměnné

hlasů
28

Nejsem si jistý, proč jsem dostat tuto chybu, ale neměli tento kód kompilace, protože jsem již kontroluje, zda fronta se stále inicializuje?

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());
}

Takže pokud fronta není inicializována, pak je pro smyčky nejsou dosažitelné v pořádku? Vzhledem k tomu, program již končí Environment.Exit (0)?

Doufat ya'll může dát mi pár rad :)

Dík.

Položena 01/11/2008 v 21:33
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
9

Překladač neví, že Environment.Exit () nevrací. Proč ne jen „návrat“ z main ()?

Odpovězeno 01/11/2008 v 21:35
zdroj uživatelem

hlasů
74

Překladač neví, že Environment.Exit () se chystá ukončit program; to prostě vidí vás provedeme statickou metodu na třídě. Jen inicializuje queuena null, když jej vyhlásit.

Queue queue = null;
Odpovězeno 01/11/2008 v 21:35
zdroj uživatelem

hlasů
0

Kompilátor ví, že kód je nebo není dostupný, pokud používáte „návrat“. Myslete na Environment.Exit () jako funkce, které voláte, a kompilátor neví, že to bude ukončení aplikace.

Odpovězeno 01/11/2008 v 21:47
zdroj uživatelem

hlasů
8

Několik různých způsobů, jak vyřešit problém:

Jen nahradit Environment.Exit s návratem. Kompilátor ví, že návrat konce této metody, ale neví, že Environment.Exit dělá.

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;   
}

Samozřejmě, že můžete opravdu jen dostat pryč s tím, protože používáte 0 jako kód ukončení ve všech případech. Opravdu, měli byste se vrátit int namísto použití Environment.Exit. V tomto konkrétním případě by to být můj preferovaný způsob

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;
    }
}

Inicializovat frontu na null, což je opravdu jen kompilátor trik, který říká, „budu vymyslet své vlastní neinicializované proměnné, děkuji moc.“ Je to užitečný trik, ale nemám rád, v tomto případě - máte příliš mnoho, pokud větve snadno zkontrolovat, zda to děláte správně. Pokud jste opravdu chtěli udělat to takhle, něco takového by bylo jasnější:

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());
}

Přidání příkazu return po Environment.Exit. Opět platí, že se jedná spíše o kompilátoru trik - ale je o něco víc důvěryhodně IMO, protože přidává sémantiku pro člověka stejně (i když vás nechám od té vychvalovaný 100% pokrytí kódu)

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());
}
Odpovězeno 02/11/2008 v 02:36
zdroj uživatelem

hlasů
-4

SqlConnection con; SqlCommand com; con = new SqlConnection ( "Data Source = \ SQLEXPRESS;. AttachDbFilename =" + Server.MapPath ( "~ \ App_Data \ Database.mdf") + "; Integrated Security = True; User Instance = 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();
    }

chyba se blíží, které používají nepřiřazené lokální proměnné.

Odpovězeno 28/06/2013 v 10:37
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more