Допустим, заказ был размещен, но еще не отправлен. Какое значение Order.ShippedDate
?
Старомодным способом справиться с этим было использование магического значения, например DateTime.MinValue
. Существовали и другие способы решения этой проблемы (например, тип оболочки или дополнительный флаг bool
, указывающий, что заказ еще не отправлен). Ни один из них не является очень удовлетворительным. Необходим единый способ решения проблемы отсутствующего или неизвестного значения.
Таким образом, современный подход состоит в том, чтобы позволить Order.ShippedDate
принимать значение, которое семантически фиксирует, что заказ еще не отправлен. Эту роль играют обнуляемые типы. Семантически вы должны думать о том, что экземпляр Nullable<T>
с HasValue
является false
как представляющий «отсутствующий» или «неизвестный».
Кроме того, в базах данных уже давно разрешено использование столбца null
. Например, у вас может быть столбец с целочисленными значениями, который допускает нулевое значение. Как вы взаимодействуете с таким столбцом из кода, если вы не разрешаете обнулять int
s? Опять же, вы могли бы использовать упомянутые выше подходы, но гораздо приятнее, когда в языке есть встроенная возможность семантической фиксации ситуации, которую мы пытаемся смоделировать.