垃圾收集器清除对象是否订阅了事件?

Car*_*rlo 5 c# garbage-collection memory-leaks

如果我执行以下操作:

public class Test
{
    public static void Main()
    {
        List<Person> persons = new List<Person> { new Person() };

        persons[0].Sneezing += new EventHandler(Person_Sneezing);

        persons = null;
    }

    public static void Person_Sneezing(object sender, EventArgs e)
    {
        (sender as Person).CoverFace();
    }
}
Run Code Online (Sandbox Code Playgroud)

亲自[0]的人是否仍然存在于内存中,因为它的打喷嚏代理具有对Person_Sneezing方法的引用或者它是否被GC收集?

Jar*_*Par 8

这将由GC收集.要保留在内存中,必须通过......直接或间接引用对象.

  1. 堆栈上的值
  2. 以强GC句柄为根的值
  3. 我现在还没想到一两个角落

这对于人[0]的对象不是这样.所以它将被收集.

这当然是假设Person()的构造函数没有做任何有趣的事情,比如将自己添加到ThreadLocalStorage.


mqp*_*mqp 6

你在那里; 如果是相反的话,这将是一个内存泄漏. 也就是说,如果它看起来像这样:

public class Test
{
    public void HookupStuff()
    {
        List<Person> persons = new List<Person> { new Person() };

        this.EventHappened += new EventHandler(persons[0].SomeMethod);
        // persons[0].Sneezing += new EventHandler(Person_Sneezing);

        persons = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在persons[0]将坚持下去,即使你已经消失了persons,因为父类有一个对它的方法的引用.