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