Лучше использовать DateTime.MinValue или обнуляемый DateTime? - PullRequest
11 голосов
/ 27 января 2010

Если бы у меня был 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

Ответы [ 3 ]

12 голосов
/ 27 января 2010

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

6 голосов
/ 27 января 2010

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

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

Например:

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

  • если вы храните значение в базе данных 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) ...
0 голосов
/ 27 января 2010

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

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

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