创建一个委托,并绑定一个实例的方法。然后设置该实例为空,可是该委托还是可执行。为什么?
此时 t 为 null ,但是 h.Target 不为 null , 不知为什么。
当执行了 t = null ; 时,gc 可回收 t 么?    public delegate void MsgHandler();    public class Test
    {
        public void Msg()
        {
            MessageBox.Show("Msg");
        }
    }在 Form 中 :
        private void Form1_Load(object sender, EventArgs e)
        {
            Test t = new Test() ;
            MsgHandler h = t.Msg;            t = null;            h();  // 依然支持执行
        }

解决方案 »

  1.   

    MsgHandler h = t.Msg;       // 把b的值给了a;即a的值现在为b;            t = null;      //现在把b的值变成0,但a的值还是b,两者没关系;            h();          //算出a的值。
      

  2.   

    你的意思是 h.Target  是实例 t 的深拷贝?我后台做测试发现,在将 t 置为null 之前,对 t 的修改都同时反应到 h.Target 上,同时对h.Target的修改也反应到 t 上,看似他们指向的是同一个对象,不是拷贝副本。但是,将t设置为null, h.Target 却不跟着变。不知为什么
      

  3.   

    t = null 的意思是将t本身的引用设置为null,不是将t所引用对象设置为null
      

  4.   

    哦,楼上的点醒了我,我尽然把这个茬给忘了h.Target 和 t 指向的是同一个对象 , 执行完 t = null , gc 并不能回收他先前的“实例”,因为在委托中他还被引用。这件事告诉我们,当在类A中,以 += 方式注册实现了一个长期存在的类B的事件时,一定别忘了使用 -=注销事件的实现方法。
    否则,只要B存在,A 就不会被gc回收。不知解释的是否合理,谢谢楼上的兄弟们关注.
      

  5.   

    老师平日总说GC和多线程只在考证时用,实际用的不多。不过这里每天那么多多线程的问题,这又冒个GC出来,看来老师说的也不尽然阿。