Должен ли я использовать default (Foo), Foo.Empty или null? - PullRequest
3 голосов
/ 09 октября 2008

Так что C # теперь позволяет вам использовать default(Foo), чтобы получить распознанный "еще не заполненный" / пустой экземпляр класса - я не уверен, точно ли он совпадает с new Foo() или нет. Многие библиотечные классы также реализуют свойство Foo.Empty, которое возвращает похожий экземпляр. И, конечно, любой ссылочный тип может указывать на null. Так на самом деле, какая разница? Когда один прав или нет? Что более последовательно или лучше работает? Какие тесты я должен использовать при проверке, если объект концептуально «не готов к прайм-тайм»? Не у всех есть Foo.IsNullOrEmpty().

Ответы [ 3 ]

16 голосов
/ 09 октября 2008

default(Foo) вернет ноль, когда Foo - это тип класса, ноль, где Foo - тип значения (например, int), и экземпляр Foo со всеми полями, инициализированными в их соответствующих default() значений, где Foo является структурой. Он был добавлен к языку, чтобы дженерики могли поддерживать как значения, так и ссылочные типы - больше информации на MSDN

Используйте default(Foo), когда вы тестируете T в контексте SomeClass<T> или MyMethod<T>, и вы не знаете, будет ли T типом значения, типом класса или структурой.

В противном случае ноль должен означать «неизвестно», а пустой - «Я знаю, что это пусто». Используйте шаблон Foo.Empty, если вам действительно нужен пустой - но ненулевой - экземпляр вашего класса; например String.Empty в качестве альтернативы "", если вам нужно инициализировать некоторую переменную пустой строкой.

Используйте значение null, если вы знаете, что работаете со ссылочными типами (классами), нет универсальных шаблонов и вы явно тестируете неинициализированные ссылки.

2 голосов
/ 10 октября 2008

Когда вы знаете фактический задействованный тип или если у вас есть параметр типа, связанный с ": class", проще всего использовать известное значение (ноль, 0 и т. Д.).

Когда вы только что получили параметр типа, который не является ограниченным или ограниченным, кроме как ссылочный тип, вам нужно использовать default (T).

2 голосов
/ 09 октября 2008

default(Foo) работает как для типов значений, так и для ссылочных типов. New Foo(), null и Foo.Empty() нет. Это делает его хорошим выбором для использования с общими типами, например, когда вы можете не знать, с чем имеете дело. Но в большинстве случаев справочного типа, null, вероятно, достаточно хорошо.

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