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 に答える