Відповіді:
Єдиний спосіб мати змінну, якій не було призначено значення в 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 це IsEmpty.
IsDefaultValueбуло б краще
Я щойно з’ясував, що GetHashCode () для непризначеного часу дати завжди дорівнює нулю. Я не впевнений, чи це хороший спосіб перевірити наявність недійсної дати, тому що я не можу знайти жодної документації щодо відображення такої поведінки.
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCodeповертає 0 з - за кліщами (внутрішнє уявлення DateTime) також дорівнює 0. Hash код обчисленого таким чином: unchecked((int)ticks) ^ (int)(ticks >> 32);. Також дивіться тут: referenceource.microsoft.com/#mscorlib/system/datetime.cs,836
Я б сказав, що значення за замовчуванням завжди new DateTime(). Так ми можемо писати
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
Я, як правило, вважаю за краще використовувати за замовчуванням типи значень, щоб визначити, чи були вони встановлені. Це, очевидно, не можливо весь час, особливо з вкладками - але для DateTimes, я думаю, що резервування MinValue для означення того, що воно не було змінено, є досить справедливим. Перевага цього над нульовими полягає в тому, що є одне менше місця, де ви отримаєте нульовий посилання на виняток (і, мабуть, багато місць, де вам не доведеться перевіряти наявність нуля, перш ніж отримати доступ до нього!)
Якщо ви не хочете турбуватися про проблеми з нульовим значенням, такі як перевірка на нуль кожного разу, коли ви його використовуєте, або загортання в якусь логіку, і вам також не хочеться турбуватися про проблеми з компенсацією часу, тоді це як я вирішив проблему:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
Я просто перевіряю, що значення за замовчуванням менше ніж через добу після початку часу. Працює як шарм.