窗体A和B,在A中自定义了事件EventA,并在其中触发,在窗体B中向事件EventA注册了处理方法methodB。假设此后窗体B的实例就被销毁了,我的疑问是:从委托的基本概念可以知道,B虽然已经销毁了,之前注册的方法methodB应该是仍然存在、仍然有效的。那么,如果此时窗体A触发了事件EventA,程序还会执行方法methodB吗?或者说程序会崩溃掉?
望高手指教,解释下其中的道理,谢谢!

解决方案 »

  1.   

    刚才写了一段代码,实际测试了一下。 void methodB()
            {
                this.Text = "OK";
                this.Show();
            }结果发现程序确实在B销毁之后,仍然会去执行方法,但是语句this.Text = "OK";正常,而语句this.Show();则会报对象不存在的错误。
    怎么解释呢?盼高手出现。
      

  2.   


    B根本不可能被GC真正销毁,因为还有其它对象的属性引用它呢。
      

  3.   

    如果生命期不一样,那么B在结束之前(Closing时),就应该去到 EventA 执行 -= 操作了。通常都是宿主程序是客户,它装载了一个服务对象,然后向服务对象注册事件回调。然后它可能清除服务对象。也就是说,通常客户程序的生命期并不是短命的。
      

  4.   

    不难想,就应该是这样,因为有引用,GC不会回收,但你已经Close了,再Show的话会报错。
    你Close后再Show应该也会报同样的错误。