(最適化されたコンパイラフラグを無視します)
一部のシステムでは、このコードがブロックに入る可能性がありますか?
if (Datetime.Now!=Datetime.Now)
{
...
}
つまり、ここで値をどのように評価しますか?(注文によるものですか)?
条件が真になる可能性のある状況はありますか?
繰り返しますが、最適化されたフラグは無視してください。
DateTime
精度は100nsです。ただし、一般的な実装では、DateTime.Now
数ミリ秒ごとにのみ変更されます。
Datetime.Now != Datetime.Now
真実である可能性がありますが、それが起こる可能性は非常に低いです。これは、マルチスレッドコードでよく見られる種類の典型的な競合状態です。つまり、変更しないことに依存するのでDateTime.Now
はなく、コピーをローカル変数に格納する必要があります。
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
)の間に遅延がある場合、等値比較器が失敗するほど十分に異なる結果が生成される可能性があります。しかし、私は個人的に、私の経験ではこの種の条件に遭遇したことはありません.