(忽略优化的编译器标志)
可能是这段代码会进入某些系统的块吗?
if (Datetime.Now!=Datetime.Now)
{
...
}
我的意思是,它如何评估这里的值? (按顺序)?
是否存在条件可能为真的情况?
再次,忽略优化标志。
答案 0 :(得分:5)
DateTime
的精度为100ns。但是在典型的实现中,DateTime.Now
每隔几毫秒才会改变一次。
Datetime.Now != Datetime.Now
可以是真的,但它极不可能发生。这是您经常在多线程代码中看到的那种典型竞争条件。即你不应该依赖DateTime.Now
不改变,而是将副本存储在局部变量中。
答案 1 :(得分:4)
DateTime.Now
内部调用:
public static DateTime Now
{
get
{
return DateTime.UtcNow.ToLocalTime();
}
}
内部调用:
public static DateTime UtcNow
{
get
{
long systemTimeAsFileTime = DateTime.GetSystemTimeAsFileTime();
return new DateTime((ulong)(systemTimeAsFileTime + 504911232000000000L | 4611686018427387904L));
}
}
其中GetSystemTimeAsFile是返回系统时钟信息的WindowsAPI函数。准确取决于系统,所以。
如果您因为某种原因在不同的获取(DateTime.Now
)之间有延迟,那么可能会产生足够不同的结果,即相等比较器失败。但就我个人而言,我从未遇到过这种情况。