在下面的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