3

我再次收到另一个 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# 是否在我需要处理的引擎盖下创建了一个临时对象?

4

1 回答 1

4

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

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

正如文档所描述的那样,在调用构造函数时像这样嵌套对象创建有点危险,因为如果其中一个对象的构造失败,则无法确保嵌套对象被正确处理。

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

于 2012-05-22T10:41:44.720 回答