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收集?
这将由GC收集.要保留在内存中,必须通过......直接或间接引用对象.
这对于人[0]的对象不是这样.所以它将被收集.
这当然是假设Person()的构造函数没有做任何有趣的事情,比如将自己添加到ThreadLocalStorage.
你在那里; 如果是相反的话,这将是一个内存泄漏. 也就是说,如果它看起来像这样:
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,因为父类有一个对它的方法的引用.
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |