只是对VisualStudio 2008编译器的快速提问。
我们确实已经启用了编译器警告被视为错误的工作正常,但今天我认识到,以下行为:
static void Main(string[] args)
{
int number = 0;
DateTime dateTime = DateTime.Now;
}
编译此代码段只会产生一个警告:“已分配变量'number',但永远不会使用其值。”
任何人都可以向我解释这个差异,为什么变量数会导致错误,而不是dateTime变量?
好吧,它似乎与文字有关。考虑以下代码:
static void Main(string[] args)
{
string str1 = "Foo";
string str2 = str1;
}
使用两行进行编译都不会发出警告,但永远不会引用变量“str2”。如果您注释掉行string str2 = str1;
,则警告显示变量“str1”从未使用过。
答案 0 :(得分:5)
这是因为DateTime.Now是一个属性,而不是文字。属性getter可能有副作用,简单地调用一个可能是有用的。并不是说这是一个好主意,但它不是 verboten 这样做,并且编译器不够聪明,无法判断它是否存在。无论如何,它最终都会调用操作系统代码来获取当前系统时间。
答案 1 :(得分:3)
我的猜测是语句int number = 0;
完全没有副作用,可以被编译器识别为多余的。另一方面,DateTime dateTime = DateTime.Now;
是对静态属性的评估,可能会执行其他代码,因此编译器不会将其标识为未使用的变量。换句话说,虽然变量可能未被使用,但分配它的行为可能会做其他事情。
答案 2 :(得分:2)
Eric Lippert在此写了an article,所以我会留给他解释一下:
通常C#会警告所有变量和 永远不会读的字段 写的等等。但在这种情况下我们 如果有意的话,有意抑制警告 赋值不是常数 表达。
这是因为没有好办法 在Visual Studio调试器中说 “告诉我最后的回报价值 函数调用“。虽然我同意 你明智地指出了吗? 解决这个问题的方法是解决这个问题 调试器,因为我没有能力 解决它,我们需要一个C#的解决方案 为我们的客户。
有关进一步说明,请参阅文章。
答案 3 :(得分:-3)
DateTime.Now是一个参考。我可能错了,因为我没有C#的经验,但我不认为你在使用DateTime.Now时创建一个新对象。