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

StackOverflow https://stackoverflow.com/questions/1423437

Вопрос

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

class MyClass
{
    int a;

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

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

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

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

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

Разве целые числа по умолчанию не равны 0?Это то, что компилятор обеспечивает для «лучших практик».Или есть другая причина?

Это было полезно?

Решение

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

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

Другие советы

  

Не целые числа по умолчанию равны 0?

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

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

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

например

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
   }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top