C# 困惑于为什么标签.Tag属性不是';I don’我不做我认为应该做的事

C# 困惑于为什么标签.Tag属性不是';I don’我不做我认为应该做的事,c#,winforms,visual-studio-2010,C#,Winforms,Visual Studio 2010,我正在WinForms应用程序中使用C。我试图根据文件的日期设置标签的值。如果“File.GetLastWriteTime”方法找不到该文件,它将返回“12/31/1600”。如果没有,我希望标签显示“未找到”。当单步执行下面的代码时,lblSqlC.Tag的值匹配为“12/31/1600”。然而“如果”的说法却发现它是错误的 lblSqlC.Tag = File.GetLastWriteTime(@"c:\sql.exe").ToShortDateString(); if (lblSqlC.

我正在WinForms应用程序中使用C。我试图根据文件的日期设置标签的值。如果“File.GetLastWriteTime”方法找不到该文件,它将返回“12/31/1600”。如果没有,我希望标签显示“未找到”。当单步执行下面的代码时,lblSqlC.Tag的值匹配为“12/31/1600”。然而“如果”的说法却发现它是错误的

lblSqlC.Tag = File.GetLastWriteTime(@"c:\sql.exe").ToShortDateString();

if (lblSqlC.Tag == "12/31/1600")
{
   lblSqlC.Text = "Not Found";
}
else
{
   lblSqlC.Text = lblSqlC.Tag;
}
我错过了什么?
谢谢

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

if (lblSqlC.Tag == "12/31/1600")
{
   lblSqlC.Text = "Not Found";
}
应更改为:

if ((string)lblSqlC.Tag == "12/31/1600")
{
   lblSqlC.Text = "Not Found";
}
或:


否则,正如@dtb所提到的,它只需使用
=
对象上定义的默认
=
操作符,并测试引用是否与其值相等(并且它们可能不相等)。

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

if (lblSqlC.Tag == "12/31/1600")
{
   lblSqlC.Text = "Not Found";
}
应更改为:

if ((string)lblSqlC.Tag == "12/31/1600")
{
   lblSqlC.Text = "Not Found";
}
或:


否则,正如@dtb所提到的,它只是使用
对象上定义的默认
=
运算符,并测试引用是否与其值相等(并且可能不相等)。

您的代码存在多个问题:

  • 类型为,因此比较测试存储在中的对象是否与
    “12/31/1600”
    的引用相同,但情况并非如此

  • 您正在将值转换为字符串,这将根据操作系统的区域设置产生不同的字符串。所以即使1。如果成功,您的代码将无法在所有系统上工作

  • 用于检查文件是否存在:

    if (!File.Exists(@"c:\sql.exe"))
    {
       lblSqlC.Text = "Not Found";
    }
    else
    {
       lblSqlC.Text = File.GetLastWriteTime(@"c:\sql.exe").ToShortDateString();
    }
    
    如果确实要避免使用,请将返回的值与值进行比较,而不转换为字符串:

    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();
    }
    

    您的代码存在多个问题:

  • 类型为,因此比较测试存储在中的对象是否与
    “12/31/1600”
    的引用相同,但情况并非如此

  • 您正在将值转换为字符串,这将根据操作系统的区域设置产生不同的字符串。所以即使1。如果成功,您的代码将无法在所有系统上工作

  • 用于检查文件是否存在:

    if (!File.Exists(@"c:\sql.exe"))
    {
       lblSqlC.Text = "Not Found";
    }
    else
    {
       lblSqlC.Text = File.GetLastWriteTime(@"c:\sql.exe").ToShortDateString();
    }
    
    如果确实要避免使用,请将返回的值与值进行比较,而不转换为字符串:

    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();
    }
    

    您不使用File.Exists来检测文件是否存在的任何原因?是否使用.Tag属性?在您的代码片段中,您只需使用字符串类型的局部变量(用于比较和赋值),我不需要这样做。我可以使用“File.GetLastWriteTime”来检查文件是否存在并获取日期(如果存在)。但是,仅仅为了这一微观优化,使用
    File.exists
    可以非常清楚地看到您正在检查文件是否存在。在看到下面的帖子之后。。。我同意。谢谢。您为什么不使用File.Exists来检测文件是否存在?是否使用.Tag属性?在您的代码片段中,您只需使用字符串类型的局部变量(用于比较和赋值),我不需要这样做。我可以使用“File.GetLastWriteTime”来检查文件是否存在并获取日期(如果存在)。但是,仅仅为了这一微观优化,使用
    File.exists
    可以非常清楚地看到您正在检查文件是否存在。在看到下面的帖子之后。。。我同意。谢谢。将日期时间值作为字符串进行比较并不是一个好主意。ToSortDateString返回一个本地化字符串。@JimDel,将其转换为字符串,因此存储在
    .Tag
    属性中的值实际上是一个字符串。但是,运算符重载解析(如方法解析)适用于编译时已知的类型。在编译时,因为
    .Tag
    object
    类型的属性,关于它所知道的只是它是一个
    对象
    ,因此它会下拉并使用为
    对象
    定义的
    =
    版本,这会导致引用比较而不是字符串值比较。将日期时间值作为字符串进行比较并不是一个好主意。ToSortDateString返回一个本地化字符串。@JimDel,将其转换为字符串,因此存储在
    .Tag
    属性中的值实际上是一个字符串。但是,运算符重载解析(如方法解析)适用于编译时已知的类型。在编译时,因为
    .Tag
    object
    类型的属性,关于它所知道的一切是它是一个
    对象
    ,因此它会下拉并使用为
    对象
    定义的
    ==
    版本,这会导致引用比较而不是字符串值比较。与其说我试图避免它,不如说它是类型较少的代码。但你的回答很好地解释了我可以走的两条路。我最近才“发现”标记属性。我假设它是字符串类型,因为.Text属性是。我不知道它是Object类型的。谢谢你的教训,还有我问题的解决方案!与其说我试图避免它,不如说是避免使用无类型代码。但你的回答很好地解释了我可以走的两条路。我最近才“发现”标记属性。我假设它是字符串类型,因为.Text属性是。我不知道它是Object类型的。谢谢你的教训,还有我问题的解决方案!