Ошибка C #:Использование неназначенной локальной переменной
-
05-07-2019 - |
Вопрос
Я не уверен, почему я получаю эту ошибку, но разве этот код не должен компилироваться, поскольку я уже проверяю, инициализируется ли очередь?
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)?
Надеюсь, вы сможете дать мне несколько советов :)
Спасибо.
Решение
Компилятор не знает, что Environment.Exit() собирается завершить программу;он просто видит, как вы выполняете статический метод в классе.Просто инициализируйте queue
равняется нулю, когда вы его объявляете.
Queue queue = null;
Другие советы
Компилятор не знает, что Environment.Exit() не возвращает.Почему бы просто не "вернуть" из Main()?
Несколько различных способов решения проблемы:
Просто замените окружение.Завершите с возвратом.Компилятор знает, что return завершает метод, но не знает эту среду.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;
}
}
Инициализируйте очередь равным null, что на самом деле является просто трюком компилятора, который говорит: "Я разберусь со своими собственными неинициализированными переменными, большое вам спасибо".Это полезный трюк, но мне он не нравится в данном случае - у вас слишком много ветвей if, чтобы легко проверить, что вы делаете это правильно.Если вы действительно хотел сделать это таким образом, что-то вроде этого было бы понятнее:
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());
}
Компилятор знает только о том, доступен код или нет, если вы используете "return".Думайте об Environment.Exit() как о функции, которую вы вызываете, и компилятор не знает, что она закроет приложение.