default(Foo)
вернет ноль, когда Foo
- это тип класса, ноль, где Foo
- тип значения (например, int), и экземпляр Foo
со всеми полями, инициализированными в их соответствующих default()
значений, где Foo
является структурой. Он был добавлен к языку, чтобы дженерики могли поддерживать как значения, так и ссылочные типы - больше информации на MSDN
Используйте default(Foo)
, когда вы тестируете T в контексте SomeClass<T>
или MyMethod<T>
, и вы не знаете, будет ли T типом значения, типом класса или структурой.
В противном случае ноль должен означать «неизвестно», а пустой - «Я знаю, что это пусто». Используйте шаблон Foo.Empty, если вам действительно нужен пустой - но ненулевой - экземпляр вашего класса; например String.Empty
в качестве альтернативы ""
, если вам нужно инициализировать некоторую переменную пустой строкой.
Используйте значение null, если вы знаете, что работаете со ссылочными типами (классами), нет универсальных шаблонов и вы явно тестируете неинициализированные ссылки.