使用对象初始值设定项生成CA 2000警告

时间:2012-01-05 07:32:20

标签: c# code-analysis fxcop object-initializers

以下代码生成CA2000警告:

Myclass myclass = null;
try
{
   myclass = new Myclass { Name = "a name" };
}
finally
{
   if (myclass != null)
   {
      myclass.Dispose();
   }
}

我发现一些主题存在同样的问题,据我所知,问题是,编译器为构造函数生成一个临时变量,对于这个变量,我没有调用Dispose()。

var tmp = new MyClass();
tmp.Name = "a name";
myclass = tmp:

所以我的问题是,如果有一个使用对象初始化器的解决方案,它不会产生ca2000警告。

先谢谢。

1 个答案:

答案 0 :(得分:0)

正如Damien在评论中指出的那样,FxCop警告是有效的,因为C#编译器在隐藏的IDisposable变量中创建temp实例,并且在初始化期间抛出异常实例不会被处置的属性。

使用良好的API设计这不会有问题,因为资源(实现IDisposable的内容)应包含Open(或BeginStart,无论如何)方法(根据框架设计指南),并且在调用Open之前不应泄漏。创建此规则的原因与您遇到的相同:在初始化期间防止泄漏。 FDG是在C#3.0之前编写的,但是当从该实例的构造函数中抛出异常(由于异步异常,例如线程中止)时,会出现同样的问题。由于此时未发布对实例的引用,因此任何人都无法处置该实例。因此,不建议在施工期间初始化基础资源。

因此,当Myclass包含某种Open方法时,以及当您未使用自己实现IDisposable的值初始化时,您可以安全地放弃该警告。在其他情况下,您应该恢复以下内容:

var myclass = new MyClass();

try
{
    myclass.Name = "a name";
}
finally
{
    myclass.Dispose();
}