代码分析不显示CA1804警告,尽管未使用的本地字符串变量在c# (VS2010高级版)

本文关键字:变量 字符串 高级版 VS2010 未使用 显示 CA1804 警告 代码 | 更新日期: 2023-09-27 18:15:14

我有以下代码,产生CA1804警告(声明的变量从未使用)从代码分析(VS2010 Premium):

...
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代码以一种将声明置于之外的方式进行了优化,如果,这反过来意味着警告确实不应该出现在上面这样的示例中,但我不确定这是否为真。

Thanks in advance

g .

代码分析不显示CA1804警告,尽管未使用的本地字符串变量在c# (VS2010高级版)

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