2010-04-06 63 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(); 
    } 
} 

我相信它會很好地重現。