Ответы:
Единственный способ иметь переменную, которой не было присвоено значение в C #, - это сделать ее локальной переменной - и в этом случае во время компиляции вы можете сказать, что она не назначена определенно, попытавшись прочитать из нее: )
Я подозреваю, что вы действительно хотите Nullable<DateTime>
(или DateTime?
с синтаксическим сахаром C #) - сделайте это null
для начала, а затем назначьте нормальное DateTime
значение (которое будет преобразовано соответствующим образом). Затем вы можете просто сравнить null
(или использовать HasValue
свойство), чтобы увидеть, установлено ли «реальное» значение.
default(DateTime)
и тем, с которым изначально было именно так. В основном он обрабатывает одно значение в домене как «особое и недоступное для нормального использования», что мне не нравится.
ты имеешь в виду так:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
или вы можете использовать Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
положите это куда-нибудь:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
затем:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmpty
метод вернет true, что, вероятно, не то, что вам нужно (потому что оно не пустое - ему было присвоено значение по умолчанию). Думаю, название вашего метода больше подошло бы IsDefaultValue
. Поскольку у вас действительно не может быть DateTime, не допускающего значения NULL IsEmpty
.
IsDefaultValue
было бы лучше
Я только что узнал, что GetHashCode () для неназначенного datetime всегда равен нулю. Я не уверен, что это хороший способ проверить значение null datetime, потому что я не могу найти никакой документации о том, почему отображается такое поведение.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
возвращает 0 из - за клещами (внутреннее представление DateTime) также равен 0. Hash код вычисленного следующим образом: unchecked((int)ticks) ^ (int)(ticks >> 32);
. Также смотрите здесь: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
Я бы сказал, что значение по умолчанию всегда new DateTime()
. Итак, мы можем написать
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
Я обычно предпочитаю, где это возможно, использовать значение по умолчанию для типов значений, чтобы определить, были ли они установлены. Очевидно, что это невозможно постоянно, особенно с целыми числами, но для DateTimes я думаю, что зарезервировать MinValue для обозначения того, что оно не было изменено, достаточно справедливо. Преимущество этого по сравнению с значениями NULL состоит в том, что на одно место меньше, где вы получите исключение с нулевой ссылкой (и, вероятно, во многих местах, где вам не нужно проверять значение NULL перед доступом к нему!)
Если вы не хотите беспокоиться о проблемах с нулевым значением, например о проверке на null каждый раз, когда вы его используете или обертываете его в какой-то логике, и вы также не хотите беспокоиться о проблемах времени смещения, тогда это как я решил проблему:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Я просто проверяю, что значение по умолчанию меньше, чем через день после начала времени. Работает как шарм.