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

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

        在C#中没有指针的概念,但通过委托可以实现C/C++中函数指针的功能,且比函数指针具有更强大的能力。方法的委托就是方法的别名(或是方法的代理),通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调等。

        一、声明委托

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

        委托的声明格式为:

<访问修饰符> 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));
        }
    }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值