首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用对象初始值设定项生成CA2000警告

使用对象初始值设定项生成CA2000警告
EN

Stack Overflow用户
提问于 2012-01-05 15:32:20
回答 1查看 567关注 0票数 1

下面的代码生成一个CA2000警告:

代码语言:javascript
复制
Myclass myclass = null;
try
{
   myclass = new Myclass { Name = "a name" };
}
finally
{
   if (myclass != null)
   {
      myclass.Dispose();
   }
}

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

代码语言:javascript
复制
var tmp = new MyClass();
tmp.Name = "a name";
myclass = tmp:

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

在进阶时谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-05 16:31:08

正如达米恩在注释中指出的那样,FxCop警告是有效的,因为C#编译器在隐藏的temp变量中创建了IDisposable实例,并且在初始化其中一个属性期间抛出异常时,该实例将不会被处理。

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

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

代码语言:javascript
复制
var myclass = new MyClass();

try
{
    myclass.Name = "a name";
}
finally
{
    myclass.Dispose();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8739065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档