2012-05-22 281 views
2

我再次遇到另一个CA2000警告。带嵌套构造函数的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文档,但无法找到一个很好的例子如何处理嵌套的构造函数。很显然,我不想将自己的参考存储在模拟器中。我想引用只传递给构造函数。

是C#创建一个临时对象,我需要处置的引擎盖下?

+0

什么是'VirtualDevice'?什么是构造函数签名? –

回答

3

是C#创建一个临时对象,我需要处理的引擎盖下?

是的,任何时候使用new运算符都会创建一个新对象。一般来说,您可以依赖垃圾收集器为您处理这种类型的事情,但是CA2000会提醒您,您创建的对象实现了接口IDisposable,因此应该调用Dispose方法以确保任何非托管资源使用获得适当的释放。

在调用构造函数时像这样嵌套对象是有点危险的,as the documentation describes,因为如果其中一个对象的构造失败了,将无法确保嵌套对象被正确处置。

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