Ошибка C #: использование неназначенной локальной переменной - PullRequest
28 голосов
/ 01 ноября 2008

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

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)?

Надеюсь, вы можете дать мне несколько советов:)

Спасибо.

Ответы [ 4 ]

75 голосов
/ 01 ноября 2008

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

Queue queue = null;
9 голосов
/ 01 ноября 2008

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

8 голосов
/ 02 ноября 2008

Несколько способов решить проблему:

Просто замените Environment.Exit на return. Компилятор знает, что 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());
}

Добавить оператор возврата после 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());
}
0 голосов
/ 01 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...