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

253
19 декабря 2017, 15:34

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

namespace Parameters
{
    class WrappedInt
    {
        public int Number;
        public WrappedInt(int a)
        {
        }
    }
}

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

Answer 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-значения до начала пробега конструктора.

READ ALSO
Проблема с тегами в UWP

Проблема с тегами в UWP

В дизайнере пытаюсь создать NavigationView или PersonPicture но они подчёркиваются и вот какие ошибки:

255
Что содержит System.Security.Policy namespace?

Что содержит System.Security.Policy namespace?

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

273
Электронная цифровая подпись

Электронная цифровая подпись

Видел куски кода на c#, но не особо шарю в этомМожете объяснить на пальцах, как это реализовать?

203
Правильное использование Аксессоров

Правильное использование Аксессоров

Хочу обратиться к данному элементу через другой класс:

235