我在WinForms应用程序中使用C#。我正在尝试根据文件的日期设置标签的值。如果找不到文件,“File.GetLastWriteTime”方法将返回“12/31/1600”。如果没有,我希望标签显示“未找到”。单步执行下面的代码时,lblSqlC.Tag的值匹配“12/31/1600”。然而“If”语句发现它是错误的。
lblSqlC.Tag = File.GetLastWriteTime(@"c:\sql.exe").ToShortDateString();
if (lblSqlC.Tag == "12/31/1600")
{
lblSqlC.Text = "Not Found";
}
else
{
lblSqlC.Text = lblSqlC.Tag;
}
我错过了什么? 谢谢。
答案 0 :(得分:4)
如果您使用==
运算符,则需要将字符串作为字符串进行比较。所以这个块:
if (lblSqlC.Tag == "12/31/1600")
{
lblSqlC.Text = "Not Found";
}
应更改为:
if ((string)lblSqlC.Tag == "12/31/1600")
{
lblSqlC.Text = "Not Found";
}
或者:
if (lblSqlC.Tag != null && lblSqlC.Tag.Equals("12/31/1600"))
{
lblSqlC.Text = "Not Found";
}
否则,正如@dtb所提到的,它只是使用在==
上定义的默认object
运算符,并测试引用是否相等(它们可能不相等)而不是它们的值。 / p>
答案 1 :(得分:3)
您的代码存在多个问题:
Tag Property的类型为Object,因此您的比较会测试Tag Property中存储的对象与"12/31/1600"
中的对象是否相同情况下。
您正在将DateTime值转换为字符串,这会导致不同的字符串,具体取决于操作系统的区域设置。因此,即使1.工作,您的代码也无法在所有系统上运行。
使用File.Exists检查文件是否存在:
if (!File.Exists(@"c:\sql.exe"))
{
lblSqlC.Text = "Not Found";
}
else
{
lblSqlC.Text = File.GetLastWriteTime(@"c:\sql.exe").ToShortDateString();
}
如果您确实想避免使用File.Exists,请将File.GetLastWriteTime返回的值与DateTime值进行比较,而不转换为字符串:
DateTime dt = File.GetLastWriteTime(@"c:\sql.exe");
// If the file does not exist, GetLastWriteTime returns 12:00 midnight,
// January 1, 1601 A.D. (C.E.) Coordinated Universal Time (UTC), adjusted
// to local time.
if (dt == new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc))
{
lblSqlC.Text = "Not Found";
}
else
{
lblSqlC.Text = dt.ToShortDateString();
}