Если вы посмотрите на следующий пример:Почему локальная переменная C# должна быть назначена напрямую, даже если это значение по умолчанию?
public void TestLocalValuesAssignment()
{
int valueVariable; // = default(int) suits fine
string refType; // null suits fine as well
try
{
valueVariable = 5;
refType = "test";
}
catch (Exception){}
Console.WriteLine("int value is {0}", valueVariable);
Console.WriteLine("String is {0}", refType);
}
вы можете легко увидеть, что переменные valueVariable
и refType
может быть Unassigned до их использования в Console.WriteLine()
. Компилятор говорит нам о том, что с ошибками:
Error 1 Use of unassigned local variable 'valueVariable'
Error 2 Use of unassigned local variable 'refType'
Это широко распространенный случай и есть loads of answers о том, как исправить, что (возможные исправления комментировал).
Я не понимаю, почему такое поведение существует? Как здесь локальные переменные отличаются от полей классов, где последние получают значение по умолчанию, если не назначены (значение null для ссылочных типов и соответствующее значение по умолчанию для типов значений)? Может быть, есть пример или угловой случай, который объясняет, почему такое поведение компилятора выбрано?
Возможный дубликат [Инициализация полей экземпляров по сравнению с локальными переменными] (http://stackoverflow.com/questions/1542824/initialization-of-instance-fields-vs-local-variables) –
Это не «поведение», , это * правило *. В определенном правиле присваивания указывается, что перед тем, как он будет использоваться, должна быть назначена переменная *. Очевидно, что это не будет в вашем фрагменте кода, когда возникает исключение. Да, может случиться. –
@TimSchmelter Полностью согласен, это дубликат. [Джон Скит предоставил] (http://stackoverflow.com/a/1542851/472020) довольно разумное объяснение, которое можно было бы рассматривать как ответ на мой вопрос. – Antonio