Проверка, имеет ли значение переменной DateTime назначенное значение - PullRequest
114 голосов
/ 20 ноября 2008

Есть ли в C # простой способ проверить, было ли экземпляру DateTime присвоено значение или нет?

Ответы [ 8 ]

265 голосов
/ 20 ноября 2008

ты имеешь в виду так:

DateTime datetime = new DateTime();

if (datetime == DateTime.MinValue)
{
    //unassigned
}

или вы можете использовать Nullable

DateTime? datetime = null;

 if (!datetime.HasValue)
 {
     //unassigned
 }
73 голосов
/ 20 ноября 2008

Единственный способ иметь переменную, которой не было присвоено значение в C #, - это сделать ее локальной переменной - в этом случае во время компиляции вы можете сказать, что она не определена, пытаясь прочитать от него:)

Я подозреваю, что вы действительно хотите Nullable<DateTime> (или DateTime? с синтаксическим сахаром C #) - задайте для него null для начала, а затем назначьте нормальное значение DateTime (которое будет преобразовано соответствующим образом). Затем вы можете просто сравнить с null (или использовать свойство HasValue), чтобы увидеть, было ли установлено «реальное» значение.

26 голосов
/ 28 июля 2015

положите это куда-нибудь:

public static class DateTimeUtil //or whatever name
{
    public static bool IsEmpty(this DateTime dateTime)
    {
        return dateTime == default(DateTime);
    }
}

тогда:

DateTime datetime = ...;

if (datetime.IsEmpty())
{
    //unassigned
}
5 голосов
/ 07 июля 2012

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

if(dt.GetHashCode()==0)
{
    Console.WriteLine("DateTime is unassigned"); 
} 
5 голосов
/ 20 ноября 2008

Используйте Nullable<DateTime>, если возможно.

4 голосов
/ 20 ноября 2008

DateTime является типом значения, поэтому оно никогда не может быть нулевым. Если вы думаете, DateTime? (Nullable) вы можете использовать:

DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;
2 голосов
/ 21 мая 2014

Я бы сказал, что значением по умолчанию всегда является new DateTime(). Таким образом, мы можем написать

DateTime datetime;

if (datetime == new DateTime())
{
    //unassigned
}
0 голосов
/ 20 ноября 2008

Я обычно предпочитаю, где это возможно, использовать значение по умолчанию для типов значений, чтобы определить, установлены ли они. Это, очевидно, невозможно все время, особенно с целочисленными типами - но для DateTimes я думаю, что резервирование MinValue для обозначения того, что оно не было изменено, является достаточно справедливым. Преимущество этого по сравнению со значениями nullables заключается в том, что в одном месте вы получите исключение нулевой ссылки (и, возможно, во многих местах вам не нужно проверять нулевое значение перед тем, как получить к нему доступ)

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