在下面的thisIsAlwaysTrue
應該始終爲真。DateTime.Now聲明
DateTime d = DateTime.Now;
bool thisIsAlwaysTrue = d == d;
但是,DateTime.Now的工作方式,這isThisAlwaysTrue保證是真的嗎?或者可以在對Now屬性的引用之間改變時鐘?
bool isThisAlwaysTrue = DateTime.Now == DateTime.Now;
在下面的thisIsAlwaysTrue
應該始終爲真。DateTime.Now聲明
DateTime d = DateTime.Now;
bool thisIsAlwaysTrue = d == d;
但是,DateTime.Now的工作方式,這isThisAlwaysTrue保證是真的嗎?或者可以在對Now屬性的引用之間改變時鐘?
bool isThisAlwaysTrue = DateTime.Now == DateTime.Now;
時鐘可以肯定地改變兩個背對背的調用DateTime.Now;
DateTime.Now屬性是易失性的,這意味着它絕對可以在使用之間改變。但是您分配給它的變量不是不穩定的。
所以這應該始終設置結果爲true:
DateTime d = DateTime.Now;
bool result = d == d;
它指定由DateTime.Now返回d變量,而不是物業本身的價值。因此,d在該代碼中總是等於d。
但是,這並不總是設置結果爲true:
bool result = DateTime.Now == DateTime.Now;
日期時間是不變的,所以它永遠不會改變分配一次。您對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
我會推薦你試試這個自己。此代碼在Release版本中只需要幾分之一秒的時間:
using System;
class Program {
static void Main(string[] args) {
while (DateTime.UtcNow == DateTime.UtcNow) ;
Console.WriteLine("oops");
Console.ReadLine();
}
}
我相信它會很好地重現。
這個答案是正確的,但不回答海報的問題。 (我這樣說只是爲了讓隨便的讀者不會期望上面代碼中的'thisIsAlwaysTrue'可能是錯誤的。) – TomZ 2011-08-08 21:45:38
但是,這是關鍵:在上面的聲明中,isThisAlwaysTrue確實每次都是錯誤的,即當實時時鐘滴答在第一次之後但在第二次給DateTime.Now之前改變時。 – 2011-08-08 23:46:57