В общем, этого следует избегать. Если вам нужен хороший случай по умолчанию, который потребует построения, вам следует подумать о переходе на класс.
Одно из основных правил проектирования для структур: Убедитесь, что состояние, в котором все данные экземпляра установлены на ноль, ложь или ноль (в зависимости от ситуации), является действительным.
Подробнее см. Руководство по проектированию .
Я только что посмотрел этот раздел в руководстве по проектированию, 2-е издание, и у них там есть подробный пример, использующий свойства и нетрадиционные переопределения, чтобы обойти это, также. Основной концепцией было частное сохранение значения таким образом, чтобы 0 было «хорошим значением по умолчанию», и выполняло некоторую форму преобразования в каждом свойстве и переопределении метода (включая ToString). В их случае они использовали положительное целое число в качестве примера и всегда сохраняли curVal-1 в закрытом члене, поэтому значение по умолчанию (0) обрабатывается как значение 1. Они добавляют конструктор с int val и сохраняют значение -1 внутри и т. д.
Это похоже на скрытые, неожиданные накладные расходы, поэтому я лично по-прежнему рекомендую (и использую) класс в этом случае.
--- Редактировать в ответ на комментарии ---
DateTime, как ваш пример, таков, потому что 0 == 1/1/0001 в полночь. DateTime использует один, ulong для представления тиков от 01.01.0001. Вот почему ( отсюда ):
«Тип значения DateTime представляет даты и время со значениями в диапазоне от 12:00:00 до полуночи, 1 января 0001 года от Anno Domini (Common Era) до 23:59:59 PM, 31 декабря 9999 года нашей эры (CE)»
Это полный спектр улонгов в клещах. «0» в структуре DateTime обрабатывается как 1/1/0001 при преобразовании в строку - значения не 1 + 1 + .... - это один 0.