万恶之源-事件

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



posted @ 2012-03-23 16:47  花生!~~  阅读(174)  评论(0编辑  收藏  举报