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

Gor*_*ger 5 c# code-analysis visual-studio-2010

我从代码分析(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 );
}
...
Run Code Online (Sandbox Code Playgroud)

当我删除ErrorProvider.SetError(...)行时,会显示CA1804警告,但为什么上面的代码示例中不是这种情况?

(顺便说一句:代码本身并不太好,只是为了说明我的问题.)

可能导致这种行为的任何想法?我想这可能是因为IL代码的优化方式是将声明置于if之外,这反过来意味着警告确实不会出现在上面的例子中,但是我我不确定这是否属实.

提前致谢

G.

Nic*_*oiu 4

这是因为 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);
}
Run Code Online (Sandbox Code Playgroud)

仅删除第二个 SetError 调用实际上足以触发 CA1804。

顺便说一句,C# 编译器应该为此发出CS0219警告,但您显然忽略了该警告。如果您对代码质量非常感兴趣(如果您正在运行代码分析,那么您可能会感兴趣),我强烈建议您将编译器警告视为错误。为什么在充分利用已经使用的筛选工具之前添加额外的筛选工具?