Подтвердить что ты не робот

Ошибка С#: использование неназначенной локальной переменной

Я не уверен, почему я получаю эту ошибку, но не должен ли этот код компилироваться, так как я уже проверяю, инициализируется ли очередь?

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

Итак, если очередь не инициализирована, то петли for не достижимы правильно? Поскольку программа уже завершается с помощью Environment.Exit(0)?

Надеюсь, я могу дать мне несколько указателей:)

Спасибо.

4b9b3361

Ответ 1

Компилятор не знает, что Environment.Exit() собирается завершить работу программы; он просто видит, что вы выполняете статический метод для класса. Просто инициализируйте queue null, когда вы его объявите.

Queue queue = null;

Ответ 2

Компилятор не знает, что Environment.Exit() не возвращается. Почему бы не просто "вернуться" из Main()?

Ответ 3

Несколько способов решения проблемы:

Просто замените Environment.Exit с возвратом. Компилятор знает, что return завершает метод, но не знает, что делает Environment.Exit.

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

Конечно, вы действительно можете просто уйти от этого, потому что во всех случаях вы используете 0 в качестве кода выхода. Действительно, вы должны вернуть int вместо использования Environment.Exit. Для этого конкретного случая это был бы мой предпочтительный метод

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

Инициализировать очередь до нуля, что на самом деле просто компилятор трюк, в котором говорится: "Я выясню свои собственные неинициализированные переменные, спасибо вам большое". Это полезный трюк, но в этом случае мне это не нравится - у вас слишком много ветвей, чтобы легко проверить, что вы делаете это правильно. Если вы действительно хотели сделать это таким образом, что-то вроде этого было бы яснее:

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

Добавить оператор return после Environment.Exit. Опять же, это скорее компиляторный трюк, но немного более легитимный IMO, потому что он добавляет семантику для людей (хотя он будет держать вас от этого хваленых 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());
}

Ответ 4

Компилятор знает, что код доступен или недоступен, если вы используете "return". Подумайте о Environment.Exit() как функцию, которую вы вызываете, и компилятор не знает, что он закроет приложение.

Ответ 5

SqlConnection con;       SqlCommand com;       con = new SqlConnection ( "Источник данных =.\SQLEXPRESS; AttachDbFilename =" + Server.MapPath( "~\App_Data\Database.mdf" ) + "; Integrated Security = True; Пользовательский экземпляр = 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();
    }

появляется ошибка, которая использует непризнанные локальные переменные.