编写关于多点委托应用的实例

【考点】
了解多点委托的创建方法,多点委托所引用方法返回值的选择。
【出现频率】
★★☆☆☆
【解答】
本例采用第二种方法创建多点委托,实现用户输入内容后,四个方法逐一被引用的功能,达到“一触即发”的效果。解决方案是建立一个委托对象,根据不同方法的引用创建多个委托类型对象,并累加至同一个对象中。在目录下新建一个程序文件,并命名为MultiDel.cs,编写代码如代码7.2所示。

代码7.2  C#的多点委托:MultiDel.cs

using System;
 
namespace NET.CHP6
{
    class MultiDel
    {
        //定义1个MyHandler委托类型,其签名接收1个string类型参数,返回类型为void
        public delegate void MyHandler(string message);
        static void Main(string[] args)
        {
            //声明MyHandler类型的mh变量
            MyHandler mh;
            //创建MyHandler对象,指向MethodA方法
            mh = new MyHandler(MethodA);
            //再次创建MyHandler对象,指向MethodB方法
            mh += new MyHandler(MethodB);
            //第3次创建MyHandler对象,指向MethodC方法
            mh += new MyHandler(MethodC);
            //第4次创建MyHandler对象,指向MethodC方法
            mh += new MyHandler(OutSide.MethodD);
            Console.WriteLine("请输入参数:");
            //接收用户输入值并赋值给InputValue变量
            string InputValue = Console.ReadLine();
            mh(InputValue);
        }
        //定义3个静态方法,符合MyHandler委托类型的签名
        static void MethodA(string content)
        {
            Console.WriteLine("\n(1)这是第1个方法执行结果,你输入的内容大写形式为:" + content.ToUpperInvariant());
        }
        static void MethodB(string content)
        {
            Console.WriteLine("\n(2)这是第2个方法执行结果\n你输入的内容小写形式为:" + content.ToLowerInvariant());
        }
        static void MethodC(string content)
        {
            Console.WriteLine("\n(3)这是第3个方法执行结果\n你输入的内容为" + content.GetType()+"类型数据");
        }       
    }
    //定义外部类,其内含静态方法MethodD符合MyHandler委托类型签名
    class OutSide
    {
        internal static void MethodD(string content)
        {
            Console.WriteLine("\n(4)这是第4个方法(外部类的静态方法)执行结果\n你输入的内容有" + content.Length + "个字符");
        }
    }
}
多点委托也称为多路广播,便于事件的使用。本例比较简单,读者应由此考虑更多委托相关的应用。在命令行下编译MultiDel.cs后,执行MultiDel程序,其效果如图7.4所示。

图7.4  C#的多点委托执行结果
注意:多点委托的委托类型必须保证相同,另外,多点委托所引用的多个方法都有返回值的情况下,只有最后被调用的方法才有返回值。
【分析】
在上节的学习中,读者知道了委托的基本使用方法。而一个委托类型对象只能指向一个方法,用多点委托可以链式地引用多个方法。简单地说,多点委托可将多个委托对象组合起来使用,类似于糖葫芦串在一起的方式,并且多个方法的引用有先后顺序。将多个委托组合有以下两种方法,共同点为都是用加号连接。
q      声明多个委托类型对象引用变量,分别指向对应的方法后,将委托类型对象引用变量用加号加入到一个委托类型对象引用变量中,如以下代码所示。
委托类型 对象名称 = new 委托类型(方法引用名称);
委托类型 对象名称2 = new 委托类型(方法引用名称2);
对象名称 = 对象名称 +对象名称2;
注意:加入顺序决定了方法引用的顺序。
q      创建多个对象并使用“+=”运算符累加入同一个委托类型对象引用变量中,如以下代码所示。
委托类型 对象名称 = new 委托类型(方法引用名称);
对象名称+ = new 委托类型(方法引用名称2);
相应地,如果需要将所指向方法从方法调用列表中删除,可以使用“-=”运算符,如以下代码所示。
委托类型 a = new 委托类型(方法引用名称1);
委托类型 b= new 委托类型(方法引用名称2);
a+ = b;
a- = b;
以上代码首先将方法引用名称1和方法引用名称2加入a对象的方法调用列表,然后将方法引用名称2的委托删除。
说明:实际上,“+=”运算符和“-=”运算符被重载了,编译时这两个运算符分别转换为调用Delegate类的Combine静态方法和Remove静态方法。

posted @ 2009-09-05 10:17  龙宫  阅读(170)  评论(0编辑  收藏  举报