в чем разница между конструктором по умолчанию и конструктором по умолчанию - PullRequest
10 голосов
/ 28 ноября 2010

У меня есть класс с именем A.В чем разница между этими двумя утверждениями?

A a = new A();

A a = default(A);

Ответы [ 3 ]

13 голосов
/ 28 ноября 2010

Это создает новый экземпляр типа A, вызывая конструктор по умолчанию, без параметров:

A a = new A();

Это присваивает значение по умолчанию для типа A переменной a и не вызывает никакого конструктора вообще:

A a = default(A);

Основное отличие состоит в том, что значение по умолчанию для типа составляет null для ссылочных типов и нулевое значение для всех типов значений (поэтому default(int) будет 0, default(bool) будет false и т. д.).

2 голосов
/ 28 ноября 2010

Для типов значений нет разницы, так как конструктор по умолчанию для типа значения всегда эквивалентен значению по умолчанию (T).Он просто заполняет все значениями 0, null, 0.0 ... В стандартной реализации .net это просто соответствует заполнению всего в вашей переменной двоичным нулем.

Для ссылочных типов new T() вызывает конструктор по умолчанию и возвращает (обычно) ненулевую ссылку.default(T), с другой стороны, эквивалентно null в этом случае.

default(T) важно, поскольку оно представляет действительное значение T, независимо от того, является ли T ссылочным типом или типом значения.Это очень полезно в общем программировании.Например, в таких функциях, как FirstOrDefault, вам нужно правильное значение для вашего результата в случае, когда в перечисляемом нет записей.И вы просто используете default(T) для этого, так как это единственное, что действительно для каждого типа.

Кроме того, для вызова конструктора по умолчанию для ссылочных типов требуется общее ограничение.И не каждый ссылочный тип реализует конструктор по умолчанию.Так что вы не всегда можете его использовать.

0 голосов
/ 28 ноября 2010

Новое ключевое слово всегда сигнализирует о выделении памяти для ссылочных типов. Никакая другая конструкция на самом деле не создает пространство в памяти для данных, которые вы собираетесь создать. Для типов значений их память всегда предварительно выделяется при использовании в функции или процедуре. Ключевое слово default позволяет универсальному типу возвращать значение по умолчанию (неинициализированное) или null для ссылочных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...