9

(忽略优化的编译器标志)

这段代码会不会在某些系统上进入块?

if (Datetime.Now!=Datetime.Now)
{
 ...
}

我的意思是,它如何评估这里的值?(是按顺序)?

是否存在条件可能为真的情况?

再次,忽略优化标志。

4

2 回答 2

5

DateTime精度为 100ns。但是在典型的实现中,DateTime.Now每隔几毫秒就会改变一次。

Datetime.Now != Datetime.Now可能是真的,但它极不可能发生。这是您在多线程代码中经常看到的典型竞争条件。即,您不应该依赖于DateTime.Now不更改,而是将副本存储在局部变量中。

于 2012-11-06T11:10:04.340 回答
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 函数。准确度取决于系统,所以。

如果您有延迟,由于不同的 get ( DateTime.Now) 之间的某种原因,它可能会产生足够不同的结果,导致相等比较器失败。但就我个人而言,在我的经验中,从未遇到过这种情况。

于 2012-11-06T11:25:05.280 回答