对于标签.Tag属性的原因感到困惑,并没有做我认为应该做的事情

时间:2011-08-05 21:09:36

标签: c# winforms visual-studio-2010

我在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;
}

我错过了什么? 谢谢。

2 个答案:

答案 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)

您的代码存在多个问题:

  1. Tag Property的类型为Object,因此您的比较会测试Tag Property中存储的对象与"12/31/1600"中的对象是否相同情况下。

  2. 您正在将DateTime值转换为字符串,这会导致不同的字符串,具体取决于操作系统的区域设置。因此,即使1.工作,您的代码也无法在所有系统上运行。

  3. 使用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();
    }