Лучше ли использовать DateTime.MinValue или nullable DateTime?

Если бы у меня был DateTime в классе под названием "TimeLastAccessed", было бы разумнее, если бы эта DateTime была нулевой:

public DateTime? TimeLastAccessed { get; set }

if (TimeLastAccessed == null) // ... handle it

чтобы указать, что он никогда не был доступен или не проверял DateTime.MinValue

public DateTime TimeLastAccessed { get; set; }

if (TimeLastAccessed == DateTime.MinValue) // ... handle it

?

Ответ 1

Имеет смысл использовать Nullable. Идея Nullable - выразить, что тип значения не имеет допустимого значения. Использовать MinValue - это патч для случаев, когда у вас нет Nullable.

Ответ 2

Я согласен с тем, что Nullable <DateTime> является лучшим выбором при отсутствии других соображений.

Однако вам нужно учитывать другие системы, с которыми вам нужно взаимодействовать.

Например:

  • если вы показываете свои .NET DateTime для COM-клиентов, вы не сможете использовать Nullable <DateTime> .

  • если вы сохраняете значение в базе данных SQL Server, помните, что SQL Server не может хранить DateTime.MinValue как DateTime.

Еще один момент, который следует учитывать, - это то, что Nullable может добавить некоторую сложность для вызывающих API: им, возможно, потребуется рассмотреть вопрос о том, как обрабатывать нулевой случай. В некоторых случаях может быть проще использовать значение по умолчанию для нулевого случая. Например, рассмотрим класс, который предоставляет свойство "ExpiryDate", где требуется значение, указывающее, что элемент никогда не истекает.

Один из подходов - использовать Nullable<DateTime> с нулевым значением, который никогда не истекает. Альтернативный подход заключается в использовании стандартного DateTime с DateTime.MaxValue, представляющим "никогда не истекает".

В этом примере тест для "истек" проще для стандартного DateTime:

if (item.ExpiryDate <= DateTime.Today) ...

чем для Nullable<DateTime>:

if (item.ExpiryDate.HasValue && item.ExpiryDate <= DateTime.Today) ...

Ответ 3

Как можно что-то существовать никогда не будет доступно? Является ли ваша собственность действительно чем-то списком LastAccessDateByCustomerOrClient?

И в вашем случае я думаю, что вы хотите... HasValue вместо == null в вашем тесте. Если вы собираетесь использовать класс, используйте его возможности в полной мере. Вероятно, он компилируется почти таким же кодом, но...