C# 第五章『面向对象』◆第10节:委托

        从数据结构来讲,委托是和类一样的,是一种用户自定义类型。委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。所有的委托都派生于System.Delegate类。

        一、声明委托

        委托是类型,与类一样,委托类型必须在被用来创建变量以及类型对象之前声明(即委托的声明在类之外)。

        委托的声明格式为:

delegate<函数返回类型><委托名>(<函数参数>)
public delegate void Fangfa(int num);
该语句定义了一个委托Fangfa,它可以注册返回void类型且有一个int作为参数。
//-------------例如
public delegate void MyDelegate();

        备注:委托可以依赖于一个类,也可以依赖于一个namespace命名空间,即在类里面声明和在类外面声明都可以。delegate可以有返回类型,也可以没有返回类型。

        二、委托的实例化

        一旦声明了委托类型,委托对象必须使用new关键字来创建,且与一个特定的方法有关。当创建委托时,传递到new语句的参数就像方法调用一样书写,但是不带有参数。

        委托实例化的格式为:

<委托类型><实例名>=new<委托类型>(<注册方法>)
//-----------------------例如:
MyDelegate zc1 = new MyDelegate(Zhangsan.Buy);

        备注:委托只是存储了各个方法的地址,它本身是什么也不做的。

using System;
//声明一个委托,其实就是个“命令”
public delegate void MyDelegate();
namespace Project19
{
    class Zhangsan
    {
        public static void Buy()
        {
            Console.WriteLine("我委托Zhangsan去购买。");
        }
    }
    class MrLi
    {
        static void Main(string[] args)
        {
            //这里就是具体阐述这个命令是干什么的
            MyDelegate zc1 = new MyDelegate(Zhangsan.Buy);
            //这时候委托被附上了具体的方法
            zc1();
        }
    }
}

        三、委托的使用、委托的多播

        委托对象可以使用“+”运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可以被合并。“-”运算符可用域从合并的委托中移除组件委托。

        备注:“+”的作用就是将两个方法都执行一遍,而不是单纯意义的将结果相加。

        委托也可以包含多个方法,这种委托称为多播委托,也叫组播。

        对于多播,调用委托后,按照注册顺序执行。不过对于有返回值的方法,将返回最后注册的方法执行后的返回值。

using System;
public delegate int  NumberDelegate(int num1, int num2); // 委托,声明在类之外
namespace Project01
{
    public class Program
    {
        public static int AddMethod(int num1, int num2)
        {
            Console.WriteLine("Sum={0}", num1 + num2);
            return num1 + num2;
        }
        public static int SubMethod(int num1, int num2)
        {
            Console.WriteLine("Sub={0}", num1 - num2);
            return num1 - num2;
        }
        public static void Main(string[] args)
        {
            NumberDelegate nd1 = AddMethod; //单播
            Console.WriteLine("委托一个方法的结果为:{0}", nd1(3, 2));
            NumberDelegate nd2 = SubMethod;
            nd2 = nd1 + nd2;                //多播            
            Console.WriteLine("委托两个方法的结果为:{0}", nd2(2, 4));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45336030/article/details/126213059