很困惑为什么一个标签.tag属性,没有做我认为它应该做的事情

本文关键字:为什么 属性 tag 标签 一个 | 更新日期: 2023-09-27 18:04:44

我在WinForms应用程序中使用c#。我试图根据文件的日期设置标签的值。"文件。如果没有找到文件,GetLastWriteTime"方法将返回"12/31/1600"。如果没有,我希望标签显示"未找到"。步进执行下面的代码时,lblsql的值。标签比赛是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;
}

我错过了什么?谢谢。

很困惑为什么一个标签.tag属性,没有做我认为它应该做的事情

如果使用==操作符,则需要将字符串作为字符串进行比较。所以这个block:

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上定义的默认==操作符,并测试引用是否相等(它们可能不相等),而不是它们的值。

你的代码有多个问题:

  1. 标签属性为Object类型,因此您的比较测试存储在标签属性中的对象是否与"12/31/1600"相同的引用,但事实并非如此。

  2. 您正在将DateTime值转换为字符串,这会根据操作系统的区域设置产生不同的字符串。所以即使。

使用文件。Exists用于检查文件是否存在:

if (!File.Exists(@"c:'sql.exe"))
{
   lblSqlC.Text = "Not Found";
}
else
{
   lblSqlC.Text = File.GetLastWriteTime(@"c:'sql.exe").ToShortDateString();
}

如果你真的想避免使用File。存在,比较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();
}