簡體   English   中英

訂閱我自己的 C# 事件會造成內存泄漏嗎?

[英]Would subscribing to my own C# event create a memory leak?

如果一個基類發布一個 C# 事件並且一個派生類訂閱它——即訂閱它自己——。 事件訂閱會阻止對象被垃圾回收嗎? 或者垃圾收集器是否足夠聰明以檢測這種循環引用情況。

乍一看,似乎應該如此,但我很確定我已經看到了執行此操作的控制代碼。 這是一個如此基本的問題,我不敢相信我以前從未研究過它。

編輯:對於 Juan R。我的意思是這樣的。 (從來沒有編譯過這段代碼,只是在我的頭頂輸入它,所以我可能有錯別字/錯誤)

public class Base
{ 
    event EventHandler<double>   ValueChanged;
}

public class Derived : Base
{
    public Derived()
    {
        // Will this prevent my object from being collected?

        ValueChanged += OnValueChanged;
    }
    private void OnValueChanged(object sender, double v) => 
    {
    }

}

訂閱其自身事件的對象不會導致內存泄漏,原因很簡單,即 CLR GC 基於可達性,而不是引用計數。 如果對象可以從 GC 根訪問,那么它無論如何都不符合 GC 的條件。 如果它不可訪問,則自引用不會使其可訪問。 關於GC 循環引用的事件沒有什么特別之處。

暫無
暫無

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

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