簡體   English   中英

完全清除多播代表字典

[英]Fully clearing a dictionary of multicast delegates

我有一個多播委托字典,其中的鍵是特定的消息類型,值是多播委托,即消息處理程序。

當我想清除該詞典時,我想確保所有委托都未綁定和取消引用並最終進行垃圾回收-清除字典是否足夠?還是應該在清除之前枚舉值(多播委托)並將其設置為null在字典下?

除非您有一個相反的示例(在這種情況下,您應該使用MS打開錯誤報告),否則.NET中的垃圾回收不會成為問題。 它相當復雜,並且可以跟蹤未在代碼中引用的對象,即使它們是從運行映像中未引用的任意大的對象圖的一部分也是如此。

即使這樣,清除字典與將其所有值設置為null也不存在區別。 兩者都具有簡單地取消引用基礎值的相同效果。 這太過分了。

.NET真正關心的不是引用安全,而是資源泄漏:任何IDisposable類都應在取消引用之前處理。 但是, MulticastDelegate不是可棄類,因此這沒有什么意義。

換句話說:這是.NET,而不是C。 別擔心。

System.Delegate(和System.MulticastDelegate)類的處理方式與其他任何類相同,只是碰巧包含指向函數和目標對象的指針。 因此,就所有意圖和目的而言,您都可以將其視為對目標對象的引用。

如果您完成了這些操作,只需清除詞典,如果您完成了包含對象的操作,您甚至根本不需要這樣做。 分別將它們設置為null並不會像清除字典一樣起作用。

一旦無法再訪問任何對象,它就有資格進行垃圾回收,如果您不熟悉垃圾回收機制,那么我強烈建議您仔細閱讀該主題。

只需將它們設置為null。

foreach (var d in dict)
{
    d = null;
}

當編譯器不再有任何引用時,它們就會為您收集垃圾。

最終,將整個字典設為null:

dict = null;

用C#進行垃圾回收應該不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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