簡體   English   中英

C#-處置遞歸對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM