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

У меня есть класс с именем 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 для ссылочных типов.