C# VisualStudio2008编译器异常警告,需要解释
只需向VisualStudio 2008的编译器提出一个简短的问题 我们确实启用了将编译器警告视为错误处理的功能,但今天我认识到以下行为:C# VisualStudio2008编译器异常警告,需要解释,c#,visual-studio-2008,C#,Visual Studio 2008,只需向VisualStudio 2008的编译器提出一个简短的问题 我们确实启用了将编译器警告视为错误处理的功能,但今天我认识到以下行为: static void Main(string[] args) { int number = 0; DateTime dateTime = DateTime.Now; } 编译此代码段只会导致一条警告:“已分配变量'number',但从未使用其值” 有人能给我解释一下区别吗?为什么变量编号导致错误,而不是日期时间变量 好的,它似乎和文字有关
static void Main(string[] args)
{
int number = 0;
DateTime dateTime = DateTime.Now;
}
编译此代码段只会导致一条警告:“已分配变量'number',但从未使用其值”
有人能给我解释一下区别吗?为什么变量编号导致错误,而不是日期时间变量
好的,它似乎和文字有关。考虑到以下代码:
static void Main(string[] args)
{
string str1 = "Foo";
string str2 = str1;
}
尽管变量“str2”从未被引用,但使用这两行编译不会导致任何警告。如果注释掉行
string str2=str1代码>对于从未使用过的变量“str1”显示警告。DateTime.Now是一个参考。我可能错了,因为我没有使用C#的经验,但我不认为您在使用DateTime.Now时正在创建新对象。这是因为DateTime.Now是一个属性,而不是文字。属性获取程序可能有副作用,只需调用一个就可以了。这并不是一个好主意,但是这样做是不可能的,而且编译器也没有足够的智能来判断它是否这样做。无论如何,它不能,它最终会调用操作系统代码来获取当前系统时间。我猜语句int number=0
完全没有副作用,编译器可以将其标识为多余DateTime DateTime=DateTime.Now另一方面,code>是对静态属性的评估,可能会执行其他代码,因此编译器不会将其标识为未使用的变量。换言之,虽然变量可能未被使用,但分配它的行为可能会做其他事情。埃里克·利珀特(Eric Lippert)在这篇文章中写道,因此我将让他来解释:
通常情况下,C#警告所有变量和
永远不会读取的字段,永远不会
但在这种情况下,我们
如果出现以下情况,则故意抑制警告:
赋值不是常数
表情
这是因为没有好办法
在VisualStudio调试器中
“显示最后一个的返回值
函数调用”。虽然我同意
你是否明智地指出了这一点
解决这个问题的方法是修复
调试器,考虑到我没有能力
为了解决这个问题,我们需要一个C语言的解决方案#
为了我们的客户
有关详细说明,请参阅文章。此外,警告还明确指出“变量‘number’让我感到困扰的是,它只适用于未使用的整数,但DateTime也不使用……好吧,Eric Lippert的那篇文章回答了我为什么VS会抑制警告。这只是为了让调试更容易。这就解释了为什么DateTime没有警告。现在,但对于仍然没有被引用的变量“DateTime”没有警告。尝试调用DateTime。现在不调用属性getter。不,这不是问题,它甚至可能是一个DateTime文本。只是,编译器不会抱怨没有使用变量“dateTime”,就像它抱怨变量“number”一样。我不确定我是否理解,文字日期时间是什么样子的?要调用属性getter,必须在表达式中使用它。例如,赋值语句的rhs。鉴于依赖getter的副作用是合法的,使用赋值语句也必须是合法的。如果那样做是违法的,你就必须跳出非常古怪的圈套,无论如何都要打电话给能手。试试看。同样的想法,指定一个参考也有副作用。现在来看垃圾收集器。有趣的是,有一种方法可以确定调试器中异常($exception
)的值。因此,catch(Exception ex)
将在从未引用ex
时发出警告。+1表示链接。这是对其他答案的一个很好的补充。感谢您在回答中引用了适用的部分。我希望有更多的人效仿这个榜样。