尽管在C#中使用了未使用的本地字符串变量,代码分析仍未显示CA1804警告(VS2010 Premium)

时间:2011-11-21 13:25:28

标签: c# visual-studio-2010 code-analysis

我有以下代码,从代码分析(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。

1 个答案:

答案 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警告,你显然忽略了它。如果您对代码质量非常感兴趣,我强烈建议将编译器警告视为错误,如果您正在运行代码分析,那么您可能会这样做。为什么在最大限度地利用已经使用的工具之前添加额外的筛选工具?