我再次发出另一个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#是否需要设置一个临时对象?
答案 0 :(得分:4)
C#是否需要设置一个临时对象?
是的,每次使用new
运算符时,都会创建一个新对象。通常,您可以依赖垃圾收集器来处理此类事情,但CA2000会提醒您,您创建的对象实现了IDisposable
接口,因此您应该调用Dispose
确保其使用的任何非托管资源得到正确释放的方法。
在对构造函数的调用中嵌套对象创建有点危险,as the documentation describes,因为如果其中一个对象的构造失败,则无法确保嵌套对象被正确处理。
我不确定你为什么要开始使用这种模式。 VirtualDevice
类应该独自负责管理它创建的对象的生命周期。 GpsService.Start()
方法应该做的所有事情(或者知道!)都是创建一个VirtualDevice
对象。反过来,该对象应该创建它需要的任何嵌套对象,随后可以确保它们被妥善处理。