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

Почему мне нужно присваивать значение int в С#, когда по умолчанию используется значение 0?

Это работает:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

Но это дает ошибку компилятора ( "Использование неназначенной локальной переменной" a "):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

Насколько я могу это сказать, это происходит потому, что в первом примере технически компилятор не знает, что "a" не назначен. В последнем примере "a" определяется локально и поэтому легко отслеживается.

Но почему последний пример не работает?

Не целые значения по умолчанию равны 0? Это что-то, что компилятор обеспечивает для "лучших практик". Или есть еще одна причина?

4b9b3361

Ответ 1

В первом примере это поле. Поля автоматически по умолчанию равны 0/false/null. Во втором примере это переменная. Переменные не дефолт и должны иметь "определенное назначение" до их использования.

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

Ответ 2

Не целые значения по умолчанию 0?

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

Ответ 3

Когда вы создаете экземпляр нового экземпляра класса, вся память, в которой нуждается объект, имеет "обнуление", ints устанавливается в 0 строк, равных нулю и т.д. Это делается для того, чтобы избежать множества странных ошибок и хаков памяти, которые были возможно в C (++). К сожалению, это также имеет небольшую стоимость обработки, поэтому, когда вы создаете локальную переменную, язык предполагает, что вы очень быстро установите значение самостоятельно и не обнуляете его, чтобы уменьшить общее количество требуемых инструкций. Чтобы компенсировать риск использования незамкнутой памяти, это вводит проверки компилятора, чтобы убедиться, что значение было установлено до того, как оно позволит вам использовать переменную.

Ответ 4

Это может быть связано с тем, что переменной, объявленной на уровне класса, нельзя присвоить значение в той же области (кроме объявления)

например

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

тогда

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

Ответ 5

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