以下代码生成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警告。
先谢谢。
答案 0 :(得分:0)
正如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();
}