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

Зачем компилировать ошибку "Использование неназначенной локальной переменной"?

Мой код следующий

int tmpCnt;  
if (name == "Dude")  
   tmpCnt++;  

Почему существует ошибка Use of unassigned local variable tmpCnt? Я знаю, что я явно не инициализировал его, но из-за Таблица значений по умолчанию тип значения инициализируется с помощью 0 в любом случае. Ссылка также напоминает мне:

Помните, что использование неинициализированных переменных в С# недопустимо.

Но почему я должен делать это явно, если это уже сделано по умолчанию? Разве это не принесло бы производительности, если бы мне не пришлось это делать? Просто интересно...

4b9b3361

Ответ 1

Локальные переменные не инициализируются. Вы должны их вручную инициализировать.

Члены инициализируются, например:

public class X
{
    private int _tmpCnt; // This WILL initialize to zero
    ...
}

Но локальные переменные не являются:

public static void SomeMethod()
{
    int tmpCnt;  // This is not initialized and must be assigned before used.

    ...
}

Итак, ваш код должен быть:

int tmpCnt = 0;  
if (name == "Dude")  
   tmpCnt++;  

Таким образом, длинный и короткий, члены инициализируются, locals - нет. Вот почему вы получаете ошибку компилятора.

Ответ 2

Назначения по умолчанию применяются к членам класса, но не к локальным переменным. Как объяснил Эрик Липперт в этом ответе, Microsoft могла инициализировать локальные жители по умолчанию, но они предпочитают не делать этого, потому что использование неназначенного локального значения почти наверняка является ошибкой.

Ответ 3

Следующие категории переменных классифицируются как первоначально неназначенные:

  • Переменные экземпляра изначально неназначенных структурных переменных.
  • Выходные параметры, включая эту переменную конструкторов экземпляров struct.
  • Локальные переменные, за исключением тех, которые объявлены в предложении catch или foreach.

Следующие категории переменных классифицируются как первоначально назначенные:

  • Статические переменные.
  • Переменные экземпляра экземпляров класса.
  • Переменные экземпляра изначально назначенных переменных структуры.
  • Элементы массива.
  • Значения параметров.
  • Справочные параметры.
  • Переменные, объявленные в предложении catch или foreach.

Ответ 4

В то время как типы значений имеют значения по умолчанию и не могут быть нулевыми, они также должны быть явно инициализированы для использования. Вы можете думать об этих двух правилах как правила бок о бок. Типы значений НЕ могут быть null == > компилятор гарантирует это. Если вы спросите, как? сообщение об ошибке, которое вы получили, является ответом. Как только вы вызываете их конструкторы, они получили инициализацию со значениями по умолчанию.

int tmpCnt; // not accepted 
int tmpCnt = new Int(); // defualt value applied tmpCnt = 0 

Ответ 5

Локальные переменные не имеют значения по умолчанию.

Они должны быть определенно назначены, прежде чем использовать их. Это уменьшает вероятность использования переменной, на которую, как вы думаете, вы дали разумную ценность, когда на самом деле она получила определенное значение по умолчанию.

Ответ 6

Смотрите эту тему относительно неинициализированных bools, но он должен ответить на ваш вопрос.

Локальные переменные не инициализируются, если вы не вызываете их конструкторы (новые) или не присваиваете им значение.

Ответ 7

Локальные переменные не инициализируются автоматически. Это происходит только с переменными уровня экземпляра.

Вам нужно явно инициализировать локальные переменные, если вы хотите, чтобы они были инициализированы. В этом случае (как объясняется связанная документация) либо путем установки значения 0, либо с помощью оператора new.

Код, который вы показали, действительно пытается использовать значение переменной tmpCnt, прежде чем он будет инициализирован чем-либо, и компилятор правильно предупреждает об этом.

Ответ 8

Таблица значений по умолчанию применяется только к инициализации переменной.

На связанную страницу следующие два метода инициализации эквивалентны...

int x = 0;
int x = new int();

В вашем коде вы просто определили переменную, но никогда не инициализировали объект.

Ответ 9

IEnumerable<DateTime?> _getCurrentHolidayList; //this will not initailize

Назначить значение (_getCurrentHolidayList) внутри цикла

foreach (HolidaySummaryList _holidayItem in _holidayDetailsList)
{
                            if (_holidayItem.CountryId == Countryid)
                                _getCurrentHolidayList = _holidayItem.Holiday;                                                   
}

После того, как вы передаете локальную переменную другому методу, как показано ниже.  Выдает ошибку (использование неназначенной переменной). Даже если упомянуто значение nullable во время декалирования.

var cancelRescheduleCondition = GetHolidayDays(_item.ServiceDateFrom, _getCurrentHolidayList);

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

IEnumerable<DateTime?> _getCurrentHolidayList =null;