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.
这是因为 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警告,但您显然忽略了该警告。如果您对代码质量非常感兴趣(如果您正在运行代码分析,那么您可能会感兴趣),我强烈建议您将编译器警告视为错误。为什么在充分利用已经使用的筛选工具之前添加额外的筛选工具?
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |