下面的代码生成一个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警告。
在进阶时谢谢。
发布于 2012-01-05 16:31:08
正如达米恩在注释中指出的那样,FxCop警告是有效的,因为C#编译器在隐藏的temp变量中创建了IDisposable实例,并且在初始化其中一个属性期间抛出异常时,该实例将不会被处理。
有了好的应用程序接口设计,这不是问题,因为资源(实现IDisposable的东西)应该包含一个Open (或Begin,Start,无论什么)方法(根据框架设计指南),并且不应该在Open被调用之前泄漏。创建此规则的原因与您正在经历的原因相同:为了防止在初始化期间发生泄漏。FDG是在C# 3.0之前编写的,但当从该实例的构造函数中抛出异常时,也存在同样的问题(由于异步异常,如线程中止,总是会发生这种情况)。由于对该实例的引用并未在此时发布,因此任何人都无法处理该实例。因此,不建议在构造过程中初始化底层资源。
因此,当Myclass包含某种Open方法,并且没有使用实现IDisposable本身的值对其进行初始化时,您可以安全地丢弃该警告。在其他情况下,您应该恢复到以下状态:
var myclass = new MyClass();
try
{
myclass.Name = "a name";
}
finally
{
myclass.Dispose();
}https://stackoverflow.com/questions/8739065
复制相似问题