更新:在C#中配置遞歸類
對不起,但我很困惑。這可能是因爲GC/Dispose的舊觀念與新觀念的混淆。
如果你在這看這裏(儘管不再維護)官方Microsoft Documentations,表示處置模式也用於釋放託管資源:
protected override void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Release **managed** resources. (!!!!!)
}
// Release unmanaged resources.
// Set large fields to null.
// Call Dispose on your base class.
disposed = true;
}
base.Dispose(disposing);
}
這是相反的是寫在new version,其中規定:不 需要明確釋放
託管內存(使用C#運營商新的內存分配)。它由 垃圾回收器(GC)自動發佈。
也許這只是在文檔中的一個錯誤,扔我離開(該死的微軟)。但也許 - 可能是在GC的早期階段,它不是那麼值得信任,而且指導方針是「如果你知道自己在做什麼,就可以自己清理自己」。現在,它已經非常值得信賴,指南是「在管理資源上永遠不會使用,我們比你更清楚」。如果這不是一個錯誤 - 那麼在這裏顯然會有一些變化或轉變。
至於這個問題 - 我不會做任何事情,並會讓GC做最瞭解的事情。
老問題:
我有了在它的節點,這是遞歸類一個TreeView ViewModel類(它們可以包含自己)。
例如
class RootViewModel // root
{
List<ItemViewModel> Children = new List<ItemViewModel>();
}
class ItemViewModel // node
{
List<ItemViewModel> Children = new List<ItemViewModel>();
}
在某些時候從樹視圖中的所有數據傳輸/保存到其他對象,我不需要TreeView的了。我猜我需要處理它? (當包含ViewModel的窗口關閉時,ViewModel類對象保存在一個靜態變量中)。
我是否需要自己處理每個節點(遞歸處理)還是足以將根對象設置爲null並調用GC?
我應該注意到我的配置沒有任何非託管資源,我只是將每個節點的Children-lists中的所有子節點設置爲null。
如此反覆 -
- 選項A:設置靜態對象爲null,調用GC.Collect()。
-
選項B:遞歸設置所有節點爲空,將靜態對象設置爲空, 調用GC.Collect()。- 根據目前的答案和評論似乎無法解決問題 - 選項C:GC看到您停止使用靜態對象,因此它將自行處理它。
如果您的解決方案包含強制垃圾收集的要求,那麼您正在做一些非常非常錯誤的事情。你似乎也有一些關於一次性垃圾和垃圾收集之間關係的錯誤信念;請記住,處置是釋放**而不是垃圾收集的資源**。你的選擇都不是正確的做法。 –
你真的想要解決什麼問題? –
@EricLippert - 我想讓我的應用程序高效和優化。我只關閉了一個窗口,並且該窗口VM使用了很多對象。我想確保他們被釋放。 –