【发布时间】:2013-12-18 14:54:10
【问题描述】:
我有一段简单(愚蠢)的代码,我用它来测试我们的错误记录机制。它尝试从不存在的文件中读取。在例外情况下,我设置了一个 DateTime 值,然后我有一个 while 循环。一旦当前 DateTime 等于我设置的 DateTime 值,我就会将异常传递给我的错误记录项目。
此代码在按下按钮时开始。这样做的目的是我可以测试当我的 ASP.NET 应用程序中的不同用户会话引发多个异常时会发生什么。
所以我会打开几个浏览器会话,按下“异常”按钮,然后这段代码就会运行。一旦当前时间与我设置的时间匹配,那么它应该抛出异常,但 if(DateTime.Now == run) 永远不会评估为真。为什么?
protected void Button1_Click(object sender, EventArgs e)
{
try
{
string text = System.IO.File.ReadAllText(@"C:\test.txt");
}
catch (FileNotFoundException ex)
{
DateTime run = new DateTime(2013, 12, 18, 14, 0, 0);
bool hasRun = false;
while (hasRun == false)
{
if (DateTime.Now == run)
{
ErrorLogger errorLogger = new ErrorLogger(ex);
hasRun = true;
}
}
}
}
【问题讨论】:
-
表达式
DateTime.Now == run不太可能评估为真,你不觉得吗?鉴于DateTime精确到万分之一毫秒? -
换句话说 - 使用
>而不是==... -
@CiaranGallagher 你没有设置毫秒,但
DateTime.Now设置了。想象一下比较1.0和1.1的两个双精度,并期望它们相等,因为您在第一个中设置了.0。 -
@CiaranGallagher:不,因为 DateTime.Now 精确到毫秒。是 1.12345 == 1.123456?
-
@CiaranGallagher - DateTime 基本上是一个穿着得体的
(U)Int64从 0001-01-01 开始计算滴答声。如果您这样创建它,您未指定的所有时间部分将自动设置为零。