CA2000具有嵌套构造函数

时间:2012-05-22 10:35:14

标签: c# .net visual-studio-2010 code-analysis

我再次发出另一个CA2000警告。

以下代码生成CA2000警告:

// Use an emulated GPS device
nmeaInterpreter.Start(new VirtualDevice(new NmeaEmulator()));

发生以下警告:

CA2000 : Microsoft.Reliability : In method 'GpsService.Start()', call System.IDisposable.Dispose on object 'new NmeaEmulator()' before all references to it are out of scope.

我已经检查过CA2000上的Microsoft文档,但找不到如何处理嵌套构造函数的好例子。显然我不想将自己的引用存储到模拟器中。我希望引用只传递给构造函数。

C#是否需要设置一个临时对象?

1 个答案:

答案 0 :(得分:4)

  

C#是否需要设置一个临时对象?

是的,每次使用new运算符时,都会创建一个新对象。通常,您可以依赖垃圾收集器来处理此类事情,但CA2000会提醒您,您创建的对象实现了IDisposable接口,因此您应该调用Dispose确保其使用的任何非托管资源得到正确释放的方法。

在对构造函数的调用中嵌套对象创建有点危险,as the documentation describes,因为如果其中一个对象的构造失败,则无法确保嵌套对象被正确处理。

我不确定你为什么要开始使用这种模式。 VirtualDevice类应该独自负责管理它创建的对象的生命周期。 GpsService.Start()方法应该做的所有事情(或者知道!)都是创建一个VirtualDevice对象。反过来,该对象应该创建它需要的任何嵌套对象,随后可以确保它们被妥善处理。