[英]C# - Disposing Recursive Objects
可以說我有一些對象C
,它持有對自身實例的引用,並且還實現了IDisposable
。 如何處理對C
其他實例的引用? 我應該遞歸調用它們的dispose
方法還是應該將它們設置為等於null? 換句話說,以下哪個模型是優選的?
模型1:遞歸處理
public class C : IDisposable
{
public List<C> subItems = new List<C>();
public void Dispose()
{
foreach (C subItem in subItems)
subItem.Dispose();
// Dispose other stuff
}
}
模型2:通過設置為null
處置
public class C : IDisposable
{
public List<C> subItems = new List<C>();
public void Dispose()
{
subItems = null;
// Dispose other stuff
}
}
我應該遞歸地調用他們的dispose方法嗎
是。
但是僅當C實際上需要為IDisposable
,這在您的代碼中並不明顯。 它引用相同類的實例這一事實無關緊要,請對所有擁有的IDisposable對象調用Dispose()。
如果這是試圖“幫助”垃圾收集器,請停止它,什么也不做。
我應該遞歸地調用他們的dispose方法嗎
不,如果您不需要它。 (GC清理了)
是。 如果對象使用非托管資源。 不處理非托管資源將導致內存泄漏。
這不僅是正確的答案。
您必須要問的主要問題-LIST的名稱是真實的項目還是單個項目的所有者?
如果是這樣-唯一有效的行為-顯式調用Dispose(如您的第一個偽代碼一樣)
如果項目是共享的或可以共享的,並且可以在其他上下文中使用,而不是在單個容器中使用(例如,與StreamWriter和Stream相同)-StreamWriter可以是Stream的“所有者”並關閉它,但是您可以使用keepLive參數來保留Stream打開)。 在共享的情況下,在這種情況下唯一有效的方法是運行-因為如果您進行處置-您可能會破壞其他任務,如果不進行處置,只是清除清單-您可以使某些資源保持活動狀態而沒有任何機會進行清理。
在C ++的shared_ptr或.NET中的常規引用中,忍者共享的方式在哪里-跟蹤使用計數-
class C:IDisposable{
int usageCount = 0;
public void AddUsage(){usageCount++;};
public void Dispose(){
if(usageCount>0){
usageCount--;
return;
}
//ELSE DO REAL DISPOSE LOGIC
}
}
但願不是你的情況)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.