我有以下代码,不从代码分析(VS2010 Premium)产生CA1804警告(从不使用声明的变量):
...
if( boolVariable )
{
string errorText = "Bla Bla Bla"; // Never used
ErrorProvider.SetError( SomeControl, "Some Warning" );
}
else
{
string errorText = "Acme Acme Acme"; // Used below
ErrorProvider.SetError( SomeControl, errorText );
}
...
当我删除 ErrorProvider.SetError(...)行时,会显示CA1804警告,但为什么上面的代码示例中不是这种情况?
(顺便说一句:代码本身并不太好,只是为了说明我的问题。)
任何可能导致此行为的想法?我想这可能是因为IL代码的优化方式是将声明置于 if 之外,这反过来意味着警告确实不会出现在像上面的那个,但我不确定这是否属实。
提前致谢
-G。
答案 0 :(得分:3)
这是因为C#编译器执行的优化。在生成的IL中,变量声明从if
块中提升:
string errorText;
if (boolVariable)
{
errorText = "Bla Bla Bla";
this.ErrorProvider.SetError(this.SomeControl, "Some Warning");
}
else
{
errorText = "Acme Acme Acme";
this.ErrorProvider.SetError(this.SomeControl, errorText);
}
仅删除第二个SetError调用实际上足以触发CA1804。
顺便说一下,C#编译器应该为此发出CS0219警告,你显然忽略了它。如果您对代码质量非常感兴趣,我强烈建议将编译器警告视为错误,如果您正在运行代码分析,那么您可能会这样做。为什么在最大限度地利用已经使用的工具之前添加额外的筛选工具?