在C#中有一种简单的方法可以检查是否为DateTime实例分配了一个值吗?
答案 0 :(得分:265)
你的意思是这样的:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
或者您可以使用Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
答案 1 :(得分:73)
拥有一个尚未在C#中赋值的变量的唯一方法是将它作为局部变量 - 在这种情况下,在编译时你可以通过尝试读取来确定它没有明确赋值从它:)
我怀疑你真的想要Nullable<DateTime>
(或DateTime?
使用C#语法糖) - 让它null
开始,然后分配一个正常的DateTime
值(将适当转换)。然后,您只需与null
(或使用HasValue
属性)进行比较,即可查看是否已设置“真实”值。
答案 2 :(得分:26)
把它放在某个地方:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
然后:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
答案 3 :(得分:5)
如果可能,请使用Nullable<DateTime>
。
答案 4 :(得分:5)
我刚刚发现未分配日期时间的GetHashCode()始终为零。我不确定这是否是检查null日期时间的好方法,因为,我找不到有关此行为显示原因的任何文档。
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
答案 5 :(得分:4)
DateTime是值类型,因此它不能永远不为null。 如果你认为DateTime? (Nullable)你可以使用:
DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;
答案 6 :(得分:2)
我说默认值始终是new DateTime()
。所以我们可以写
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
答案 7 :(得分:0)
在可能的情况下,我通常更喜欢使用值类型的默认值来确定它们是否已设置。这显然不可能一直存在,特别是对于整数 - 但对于DateTimes,我认为保留MinValue表示它没有被改变是公平的。这个超过nullables的好处是,你可以获得一个空引用异常的地方少一个(并且可能有很多地方在你访问它之前你不必检查null!)
答案 8 :(得分:0)
如果您不想担心Null值问题,例如每次使用它时都要检查null或将其包装成某种逻辑,并且您也不必担心偏移时间问题,那么这就是我解决问题的方式:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
我只是检查默认值是否在时间开始后不到一天。就像魅力一样。