public delegate void aHandler(string text);

    public class A1
    {
        public void Print(string txt)
        {
            Console.WriteLine(txt + "我是1号");
        }
    }

    public class A2
    {
        public void Print(string txt)
        {
            Console.WriteLine(txt + "我是2号");
        }
    }

    class B1
    {
        public static void StaticPrint(string txt)
        {
            Console.WriteLine(txt + "我是3号");
        }

        public static void Main()
        {
            string my = "委托链";
            A1 a1 = new A1();
            A2 a2 = new A2();
            //创建委托实例
            aHandler ah1 = new aHandler(a1.Print);
            aHandler ah2 = new aHandler(a2.Print);
            aHandler ah3 = new aHandler(StaticPrint);

            Console.WriteLine("委托实例ah1的打印结果:");
            ah1(my);

            Console.WriteLine("委托实例ah2的打印结果:");
            ah2(my);

            Console.WriteLine("委托实例ah1+ah2的打印结果:");
            aHandler ah = ah1 + ah2;
            ah(my);

            Console.WriteLine("委托实例ah1+ah2+ah3的打印结果:");
             ah += ah3;
            ah(my);

            Console.WriteLine("委托实例ah1+ah3的打印结果:");
            ah -= ah2;
            ah(my);

            Console.WriteLine("委托实例ah3的打印结果:");
            ah -= ah1;
            ah(my);

            Console.WriteLine("试图调用null委托会引发异常");
            try
            {
                ah-=ah3;
                ah(my);
            }
            catch(NullReferenceException ex) //尝试取消引用空引用对象时引发的异常
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("试图从null中移出委托是无效操作");
            try
            {
                ah -=ah3;
            }
            catch(NullReferenceException ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.Read();
        }
    }

运行结果:

委托实例ah1的打印结果:
委托链我是1号
委托实例ah2的打印结果:
委托链我是2号
委托实例ah1+ah2的打印结果:
委托链我是1号
委托链我是2号
委托实例ah1+ah2+ah3的打印结果:
委托链我是1号
委托链我是2号
委托链我是3号
委托实例ah1+ah3的打印结果:
委托链我是1号
委托链我是3号
委托实例ah3的打印结果:
委托链我是3号
试图调用null委托会引发异常
未将对象引用设置到对象的实例。
试图从null中移出委托是无效操作

 

委托是对方法或方法列表的引用,可以说是一种引用类型。委托分为三步:声明、实例化、调用。

posted on 2015-09-23 19:22  miaoying  阅读(157)  评论(0编辑  收藏  举报