关于委托的+=操作

举个简单的例子:

    class Program
    {
        public static EventHandler eh = null;
        public void test(object sender, EventArgs e)
        {
            Console.WriteLine(sender.ToString());
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            Dictionary<stringobject> d = new Dictionary<stringobject>();
            eh = p.test;
            d.Add("other", eh);
            eh += p.test;
            eh("I am the Original"null);
            eh = d["other"as EventHandler;
            Console.WriteLine("--------------------------------------------------");
            eh("I am the Other"null);
            Console.Read();
        }
    }

上面代码的Main函数经过 reflector 查看后如下:
private static void Main(string[] args)
{
    Program p = new Program();
    Dictionary<string, object> d = new Dictionary<string, object>();
    eh = new EventHandler(p.test);
    d.Add("other", eh);
    eh = (EventHandler) Delegate.Combine(eh, new EventHandler(p.test));
    eh("I am the Original", null);
    eh = d["other"] as EventHandler;
    Console.WriteLine("--------------------------------------------------");
    eh("I am the Other", null);
    Console.Read();
}
也就是说 经过+=操作后eh已经指向新的对象了(通过 Delegaate.Combine 合并成一个新的对象),而字典中保存的eh 指向原始的对象,像上文一样使用委托 造成了不一致,这很有点像.net 中
System.String类型。
posted @ 2011-06-21 10:25  ergon  阅读(166)  评论(0编辑  收藏  举报