Answers:
在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
。由于您不能真正拥有一个不能为null的DateTime IsEmpty
。
IsDefaultValue
会更好
我刚刚发现,未分配日期时间的GetHashCode()始终为零。我不确定这是否是检查空datetime的好方法,因为我找不到任何有关为何显示此行为的文档。
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
由于滴答(DateTime的内部表示形式)也等于0,因此返回0。哈希代码通过以下方式计算: unchecked((int)ticks) ^ (int)(ticks >> 32);
。另请参见此处:referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
我会说默认值始终是new DateTime()
。所以我们可以写
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}