场景有2个类
class A { public EventHandler TestEventHandler; } class B { public string Name { get; set; } public void Test(object o, EventArgs e) { Console.WriteLine(Name+"say:我依然活着。。。"); //do somethings } } class Program { static void Main(string[] args) { A a = new A(); B b = new B(); b.Name = "__b"; a.TestEventHandler += b.Test;//TestEventHandler不仅仅存着Test方法的信息,还存着b的引用呢 b = null; GC.Collect(); a.TestEventHandler(null, null); Console.ReadKey(); } }
在a长期存活的,而b短命且不断新建、销毁的情况,就造成了内存的泄露。
这在复杂的多层的场景下,这样的bug是很难被发现的。。
万恶的事件啊。更可恶的是TestEventHandler不能直接置为null,非要-=。。。还必须是找到原引用的方法。fuck!
解决办法1:使用Dispose()模式。
2:使用弱引用。