Почему я должен присвоить значение int в C #, когда по умолчанию 0? - PullRequest
24 голосов
/ 14 сентября 2009

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

class MyClass
{
    int a;

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

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

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

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

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

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

Ответы [ 5 ]

34 голосов
/ 14 сентября 2009

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

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

11 голосов
/ 14 сентября 2009

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

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

2 голосов
/ 14 сентября 2009

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

* 1003 например *

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
   }
}
2 голосов
/ 14 сентября 2009

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

0 голосов
/ 17 июля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...