Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Реализация конструктора по умолчанию

#c_sharp


Добрый день. Помогите разобраться с теорией. В книге говорится, что для каждого класса
в программе компилятор создает конструктор по умолчанию, который инициализирует поля
класса значениями по умолчанию (0, null, false). Но если создать свой конструктор вручную,
то компилятор не будет создавать конструктор по умолчанию. Есть код:

namespace Parameters
{
    class WrappedInt
    {
        public int Number;

        public WrappedInt(int a)
        {

        }
    }
}


Создан конструктор с параметрами, поэтому, как я понимаю, конструктор по умолчанию
не будет создан автоматически. Следовательно поле Number не будет инициализировано
значением по умолчанию, так как не будет создано default-конструктора, который инициализирует
поля класса такими значениями. Поэтому при обращении к полю должна быть ошибка, но
при выводе значения поля в консоль получаем 0. Почему так происходит? Действительно
ли инициализация default-значениями происходит в конструкторе по умолчанию? Спасибо
заранее за помощь. 
    


Ответы

Ответ 1



Дело в том, что при выделении памяти она обнуляется. .NET устроен так, что default-значение каждого типа состоит из нулей в битовом представлении. Поэтому все значения окажутся инициализированы default-значением. Документация: If T is a class_type: A new instance of class T is allocated. If there is not enough memory available to allocate the new instance, a System.OutOfMemoryException is thrown and no further steps are executed. All fields of the new instance are initialized to their default values (Default values). The instance constructor is invoked according to the rules of function member invocation (Compile-time checking of dynamic overload resolution). A reference to the newly allocated instance is automatically passed to the instance constructor and the instance can be accessed from within that constructor as this. Мы видим, что хоть обнуление памяти и не требуется по стандарту, тем не менее требование состоит в том, что все поля получают default-значения до начала пробега конструктора.

Комментариев нет:

Отправить комментарий