是通过event的GetInvocationList()找出所有委托,然后下载吗? 但是为什么一定要卸载掉呢? 如果不卸载,调用dispose之后,把对象设为null, 等待垃圾回收。 对注册了该事件的那些方法并没有任何影响啊。因为事件已经不会触发了,不会让他们去响应。  请大家谈谈自己的想法, 谢谢

解决方案 »

  1.   

    不用管,
    例如
    cbxColorway.SelectedIndexChanged += new System.EventHandler(this.cbxColorway_SelectedIndexChanged);如果cbxColorway被销毁了,cbxColorway.SelectedIndexChanged中的event也就一起销毁了。SelectedIndexChanged就相当于成员变量而已。
      

  2.   

    那如果 是 cbxColorway.SelectedIndexChanged += new System.EventHandler(otherObj.cbxColorway_SelectedIndexChanged); 
    呢? otherObj是另外一个对象
      

  3.   

    其实不管这个的事。 关键是  为什么.net框架程序设计和effective c#里,都说要如果是手动调用的Dispose,那么应该释放托管资源,并且要注销事件。
    这里有2个问题:
    1. 包含事件的对象都注销了,为什么还需要注销里面的事件?因为根本就没有东西来触发这个事件了。触发事件只能是这个对象本身。
    2. 为什么需要释放托管资源 ? 比如对象A里有另一个对象B,它的意思就是在dispose中,如果是手动调用,那么应该释放B。请问怎么释放? B= null吗? 其实A.Dispose(true),然后A = null. 这样A不可到达了, B也变得不可到达,还有必要把B也设成null 吗? 
      

  4.   

     
     为什么.net框架程序设计和effective c#里,都说要如果是手动调用的Dispose,那么应该释放托管资源,并且要注销事件
    我想,这里说的注销事件应该指:如果该IDispose对象订阅过事件,在Dispose前应该取消订阅。
    一个对象Dispose后,别人再调用它,就可能产生异常或不可预料的后果。比如下面的例子,一个My对象订阅了Program.DoSomething的静态事件。
    如果My对象没有取消订阅,那么在My对象Dispose后,触发Program.DoSomthing事件时,将调用已注销的对象,以致出现异常。
     为什么需要释放托管资源 ? 比如对象A里有另一个对象B,它的意思就是在dispose中,如果是手动调用,那么应该释放B。请问怎么释放? 

    一般在Dispose的时候,要释放非托管资源。比如下面的例子My对象申请了一段非托管内存(以便和本地dll通讯等等),如果没有释放该资源,那么将造成内存泄露。
    至于及时释放托管资源,则用IComponent模式更加合适。有兴趣你可看ComponentModel下的IContainer和IComponent。请注意我的例子为求简单,没有用Dispose(bool disposing)模式,不会自动销毁。using System;
    using System.Runtime.InteropServices;namespace ConsoleApplication1
    {
        class Program
        {
            public static event EventHandler DoSomething;
            static void Main(string[] args)
            {
                My my = new My();            FireDoSomethingEvent();          // ok
                my.Dispose();            FireDoSomethingEvent();          // <---- 将出现异常
            }
            static void FireDoSomethingEvent()
            {
                if (Program.DoSomething != null)
                {
                    Program.DoSomething(null, EventArgs.Empty);
                }
            }
        }    class My : IDisposable
        {
            public My()
            {
                data = Marshal.AllocHGlobal(16 * 1024);                          // 申请非托管内存
                Program.DoSomething += new EventHandler( this.OnDoSomething );
            }        public void Dispose()
            {
                Marshal.FreeHGlobal(data);                                       // 释放非托管内存
                data = IntPtr.Zero;
            }        private void OnDoSomething(object sender, EventArgs e)
            {
                Marshal.WriteInt32(data, 1234);                                  // 写入非托管内存
                //CallNativeMethod(data);                                        // 调用非托管dll...
            }
            private IntPtr data;
        }
    }