带有嵌套构造函数的 CA2000

本文关键字:CA2000 构造函数 嵌套 | 更新日期: 2023-09-27 18:35:01

我再次发出另一个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.

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

C# 是否在后台创建了一个我需要释放的临时对象?

带有嵌套构造函数的 CA2000

C# 是否在后台创建了一个我需要释放的临时对象?

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

如文档所述,在对构造函数的调用中像这样创建嵌套对象有些危险,因为如果其中一个对象的构造失败,则无法确保嵌套对象得到正确释放。

我不太确定你为什么要使用这种模式。VirtualDevice类应全权负责管理其创建的对象的生存期。GpsService.Start()方法所要做的就是创建一个VirtualDevice对象。反过来,该对象应该创建它需要的任何嵌套对象,随后它可以确保正确释放这些对象。