2012-05-22 330 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對象。該對象應該反過來創建它需要的任何嵌套對象,隨後可以確保它被正確處置。