2010-04-06 64 views
4

在下面的thisIsAlwaysTrue应该始终为真。DateTime.Now声明

DateTime d = DateTime.Now; 
bool thisIsAlwaysTrue = d == d; 

但是,DateTime.Now的工作方式,这isThisAlwaysTrue保证是真的吗?或者可以在对Now属性的引用之间改变时钟?

bool isThisAlwaysTrue = DateTime.Now == DateTime.Now; 

回答

10

时钟可以肯定地改变两个背对背的调用DateTime.Now;

+0

这个答案是正确的,但不回答海报的问题。 (我这样说只是为了让随便的读者不会期望上面代码中的'thisIsAlwaysTrue'可能是错误的。) – TomZ 2011-08-08 21:45:38

+0

但是,这是关键:在上面的声明中,isThisAlwaysTrue确实每次都是错误的,即当实时时钟滴答在第一次之后但在第二次给DateTime.Now之前改变时。 – 2011-08-08 23:46:57

8

DateTime.Now属性是易失性的,这意味着它绝对可以在使用之间改变。但是您分配给它的变量不是不稳定的。

所以这应该始终设置结果为true:

DateTime d = DateTime.Now; 
bool result = d == d; 

它指定由DateTime.Now返回d变量,而不是物业本身的价值。因此,d在该代码中总是等于d。

但是,这并不总是设置结果为true:

bool result = DateTime.Now == DateTime.Now; 
0

日期时间是不变的,所以它永远不会改变分配一次。您对DateTime.Now的调用不会“链接”它 - 它只是分配 DateTime.Now在调用变量d时 - 它不会分配某种引用。

所以,如果你有这样的延迟:

DateTime d = DateTime.Now; // Let's assume it's 9:05:10 
Thread.Sleep(100); 
Console.WriteLine(d); // will still be 9:05:10, even though it's much later now 
1

我会推荐你​​试试这个自己。此代码在Release版本中只需要几分之一秒的时间:

using System; 

class Program { 
    static void Main(string[] args) { 
    while (DateTime.UtcNow == DateTime.UtcNow) ; 
    Console.WriteLine("oops"); 
    Console.ReadLine(); 
    } 
} 

我相信它会很好地重现。