Как проверить значение DateTime по умолчанию?

Мне нужно проверить значение DateTime, если оно имеет значение или нет.

У меня есть несколько вариантов:

if (dateTime == default(DateTime))

или

if (dateTime == DateTime.MinValue)

или используя значение с нулевым значением DateTime?

if (nullableDateTime.HasValue)

Лично я предпочел бы третью версию, так как ее довольно хорошо читаем. Но в нашей базе данных есть несколько столбцов datetime, которые определены как не равные нулю. Поэтому в некоторых случаях я должен использовать первые два варианта.

Я где-то читал, что ключевое слово default должно использоваться при работе с дженериками, но разве это не является более читаемым в этом случае? При использовании второго варианта я должен знать, что значением по умолчанию для нового и пустого экземпляра DateTime является DateTime.MinValue, у которого есть запах детали реализации для меня.

Итак, какой вариант использовать для использования "лучшей практики"?

Ответ 1

Я бы предположил, что это действительно явное:

// Or private, or maybe even public
internal static readonly DateTime MagicValueForNullDateTimeInNonNullableColumns
    = DateTime.MinValue;

Хорошо, поэтому я бы назвал это имя немного менее многословным, но вы понимаете, что я имею в виду. На самом деле не имеет большого значения, как вы инициализируете это значение - это ясно, что вы пытаетесь сделать.

(Конечно, используйте тип с нулевым значением в любое время. Я предполагаю, что вопрос задан, потому что вы не могли сделать это в определенных ситуациях.)

Ответ 2

Мне нужно проверить значение DateTime, если оно имеет значение или нет.

Вы довольно подробно описали ситуацию с учебником, требующую Nullable<DateTime>. Я бы пошел с этим вариантом.

(Вам, очевидно, понадобится какой-то слой перевода, если вам нужно сохранить значения в столбце с нулевым db, но я бы постарался сохранить любое "магическое" значение как можно ближе к db, и попробуйте сохранить код С# чистым и идиоматичным.)

Ответ 3

"Лучшая" практика будет использовать значение с нулевым значением DateTime. Неверные типы значений были созданы именно по этой причине, не доверяя "магическим" номерам.

Что самое важное в этом подходе - это его намерение - что это означает, что в вашем контексте есть дата/время по умолчанию?

Ответ 4

Возможно, вы можете установить значение по умолчанию в своей базе данных с помощью getdate(), а затем обновить все нулевые значения до минимального значения или того, что вам нравится. По крайней мере, у вас будет одно условие