2012-12-13 43 views
2

我從我的代碼分析得到CA2000錯誤問我退出範圍在退出我的方法範圍之前,我應該真的處理我的對象嗎?

釋放對象失去範圍在方法之前 「的MyMethod(GUID?)」,稱 System.IDisposable的前處置我的對象。在所有對 的引用之前,先刪除對象'person',這是超出範圍的。

我很驚訝這個規則的,因爲我覺得在離開作用域時的處置被自動運行。注意:A similar question已經被要求確認我的意見並不強制處理程序。

如果我不處理我的對象並且不在使用指令中使用它,會發生什麼情況?

+0

你從哪裏得到該報價?從上下文來看,它似乎並不多;只需在'using'語句中包裝你的方法。 –

+0

發佈您的代碼。只有使用'using'纔會調用dispose。 –

+0

這取決於Person的定義。它實現IDisposable表明它應該在一個使用塊中。 – Kaido

回答

2

我想退出範圍時脫手被自動運行。

任何範圍,只有using塊範圍。退出方法與退出using塊不同。

如果一個對象實現了IDisposable,那麼您應該始終手動或通過using塊來處置它。根據您的代碼結構,由您決定何時做到這一點。

3

處理決不會自動調用。你必須明確地調用它,或者使用'using'關鍵字。至少,如果你不處理你的對象,它可能由垃圾回收器完成,但只有當你實現了正確的模式時。

1

當對象超出範圍時不調用Dispose。在許多情況下,它會在垃圾收集對象時調用(當實現Finalizer和Dispose時調用它)。

2

如果你在using聲明中包裝你的對象,你可以,因爲它會被翻譯成。

try{ 
    var myObject = new MyObject(); 
}finally{ 
    myObject.Dispose(); 
} 

更新

如果你不處理你的對象是「可能會留在記憶永遠」保持連接的資源。但可能不會。它在垃圾收集器出現時會依賴它來嘗試清除它。但要小心GC是只能清除管理資源

在這裏尋找類似的問題:What happens if I don't call Dispose on the pen object?

相關問題