检查DateTime变量是否已分配值

Moo*_*Moo 118 c# datetime

在C#中有一种简单的方法来检查DateTime实例是否已被赋值?

Hat*_*ath 278

你的意思是这样的:

DateTime datetime = new DateTime();

if (datetime == DateTime.MinValue)
{
    //unassigned
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用Nullable

DateTime? datetime = null;

 if (!datetime.HasValue)
 {
     //unassigned
 }
Run Code Online (Sandbox Code Playgroud)

  • 要添加@RupertRawnsley所说的内容,您实际应该与default(DateTime)进行比较,该默认值是未分配的DateTime的值.它恰好等于MinValue,但它可能会改变. (15认同)
  • 只有第二个是防弹的.第一个假设是关于框架无法保证的DateTime的未设置表示.我个人认为他们应该为这个场景添加一个Unset静态成员. (5认同)

Jon*_*eet 78

拥有一个尚未在C#中赋值的变量的唯一方法是将它作为局部变量 - 在这种情况下,在编译时你可以通过尝试从中读取来确定它没有明确赋值: )

我怀疑你真的想要Nullable<DateTime>(或DateTime?使用C#语法糖) - 让它null开始,然后分配一个正常值DateTime(将适当转换).然后你可以比较null(或使用HasValue属性)来查看是否已经设置了"真实"值.

  • @Menol:嗯,这并没有说明一个故意被赋予了"default(DateTime)"值的字段和一个只是那种方式开始的字段之间的区别.基本上它将域内的一个值视为"特殊且不可用于正常使用",这是我不喜欢的. (6认同)
  • 如何检查该值是否等于默认日期时间值。这种方法有什么不明显的缺点吗?if(request.StartDateTime == default(DateTime) { request.StartDateTime = DateTime.Now; } (2认同)

son*_*que 28

把它放在某个地方:

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

然后:

DateTime datetime = ...;

if (datetime.IsEmpty())
{
    //unassigned
}
Run Code Online (Sandbox Code Playgroud)


bar*_*tta 5

Nullable<DateTime>尽可能使用.


TcK*_*cKs 5

DateTime 是值类型,所以它不能永远为空。如果你认为DateTime?( Nullable ) 你可以使用:

DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;
Run Code Online (Sandbox Code Playgroud)


Arc*_*rus 5

我刚刚发现,未分配日期时间的GetHashCode()始终为零。我不确定这是否是检查null日期时间的好方法,因为我找不到任何有关为什么显示此行为的文档。

if(dt.GetHashCode()==0)
{
    Console.WriteLine("DateTime is unassigned"); 
} 
Run Code Online (Sandbox Code Playgroud)


小智 5

我会说默认值总是new DateTime(). 所以我们可以写

DateTime datetime;

if (datetime == new DateTime())
{
    //unassigned
}
Run Code Online (Sandbox Code Playgroud)

  • +Hath 在 2008 年已经给出了这个解决方案,正如 +Rupert Rawnsley 作为评论添加的那样,它不是防弹的...... (3认同)