1

以下代码生成 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 警告。

提前致谢。

4

1 回答 1

1

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

有了一个好的 API 设计,这不会是一个问题,因为资源(实现 的东西IDisposable)应该包含一个Open(或Begin,,Start等等)方法(根据框架设计指南),并且在Open调用之前不应该泄漏。创建此规则的原因与您遇到的相同:防止在初始化期间泄漏。FDG 是在 C# 3.0 之前编写的,但是当从该实例的构造函数中抛出异常时也会存在同样的问题(由于线程中止等异步异常,总是会发生这种情况)。由于此时尚未发布对该实例的引用,因此任何人都无法处置该实例。因此不建议在构建过程中初始化底层资源。

Myclass因此,当包含某种Open方法时,并且当您没有使用实现IDisposable自身的值对其进行初始化时,您可以安全地丢弃该警告。在其他情况下,您应该恢复到以下内容:

var myclass = new MyClass();

try
{
    myclass.Name = "a name";
}
finally
{
    myclass.Dispose();
}
于 2012-01-05T08:31:07.960 回答