场景有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:使用弱引用。