Какая разница между конструктором по умолчанию и по умолчанию
У меня есть класс с именем A
. Какая разница между этими двумя утверждениями?
A a = new A();
A a = default(A);
Ответы
Ответ 1
Это создает новый экземпляр типа A
, вызывая конструктор без параметров:
A a = new A();
Это присваивает значение по умолчанию для типа A
переменной A
и не вызывает никакого конструктора вообще:
A a = default(A);
Основное отличие состоит в том, что значение по умолчанию для типа null
для ссылочных типов и нулевое значение для всех типов значений (поэтому default(int)
будет 0
, default(bool)
будет false
и т.д.).
Ответ 2
Для типов значений нет разницы, поскольку конструктор по умолчанию типа значения всегда эквивалентен по умолчанию (T). Он просто заполняет все 0
, null
, 0.0
... В реализации по умолчанию .net это соответствует заполнению всего в вашей переменной двоичным нулем.
Для ссылочных типов new T()
вызывает конструктор по умолчанию и возвращает (обычно) ненулевую ссылку.
default(T)
, с другой стороны, эквивалентно null
в этом случае.
default(T)
важен, поскольку он представляет допустимое значение T, независимо от того, является ли T ссылочным или стоимостным типом. Это очень полезно в общем программировании.
Например, в таких функциях, как FirstOrDefault
, вам нужно действительное значение для вашего результата в случае, когда перечисляемый не имеет записей. И вы просто используете default(T)
для этого, поскольку это единственное, что действительно для каждого типа.
Кроме того, для вызова конструктора по умолчанию для ссылочных типов требуется общее ограничение. И не каждый ссылочный тип реализует конструктор по умолчанию. Поэтому вы не всегда можете использовать его.
Ответ 3
Новое ключевое слово всегда сигнализирует распределение памяти для ссылочных типов. Никакая другая конструкция фактически не создает пространство в памяти для данных, которые вы собираетесь создавать. Для типов значений их память всегда предварительно выделяется при использовании в функции или процедуре. Ключевое слово default
позволяет универсальному типу вернуть значение по умолчанию (неинициализированное) или null
для ссылочных типов.