C#中的委托

一、委托

在c#中,委托(delegate)是一种引用类型,它定义了方法的签名,并且可以引用符合该签名的方法。委托类似与c++中的函数指针,但委托是类型安全的,并且可以与事件一起使用。

1、定义

委托的定义包含返回值类型和参数列表,与方法的签名相匹配。定义委托的语法如下:

public delegate int MyDelegate(int num);//MyDelegate是一个委托类型,它接受一个整型参数并返回int类型

2、委托的实例化

一旦定义了委托类型,就可以创建该类型的实例,并将它指向一个方法。这个过程称为委托的实例化或委托的创建。

public delegate void MyDelegate();//声明委托

public void PrintString()//创建一个输出Hello World字符串的方法
{
    Console.WriteLine("Hello World");
}

MyDelegate m = new MyDelegate(PrintString);//实例化委托,并通过委托实现方法

在这个例子中,PrintString方法与MyDelegate委托类型匹配,因此可以创建一个MyDelegate类型的委托实例m并将其指向PrintString方法

3、委托的调用

委托实例可以像方法一样被调用,调用时会执行它所引用的方法

m();//输出"Hello World"

4、例子

using System;

namespace ConsoleApp1
{
    public delegate int MyDelegate(int num);
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.AddNum(10);//正常调用方法
            Console.WriteLine(myClass.num);//输出10
            MyDelegate myDelegate = new MyDelegate(myClass.AddNum);//通过委托调用方法
            myDelegate(10);//调用委托,由于前面num的值已经为10,所以此行语句执行后num为20
            Console.WriteLine(myClass.num);//20
        }
    }
    class MyClass
    {
        public int num;
        public int AddNum(int a)
        {
            num += a;
            return num;
        }
    }    
}

二、多播委托

1、定义

C#中的委托支持多播(Multicast),这意味着一个委托实例可以引用多个方法。当调用多播委托时,它会按顺序调用所有引用的方法。 

注意:只有相同类型的委托才可以被合并

2、例子

using System;

namespace ConsoleApp1
{
    public delegate void MyDelegate();
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.StartBook();
            myClass.ReadBook();//普通调用方法
            //通过多播委托来调用两个方法
            //方法1:
            MyDelegate m1 = new MyDelegate(myClass.StartBook);
            MyDelegate m2 = new MyDelegate(myClass.ReadBook);
            MyDelegate m3 = m1 + m2;
            m3();
            //方法2:
            MyDelegate m1 = new MyDelegate(myClass.StartBook);
            MyDelegate m2 = new MyDelegate(myClass.ReadBook);
            m1 += m2;
            m1();//这里会先输出打开书本再开始读书
            m2 += m1;
            m2();//这里会先输出开始读书再打开书本
            m2 -= m1;
            m2();//这里不会输出打开书本
        }
    }
    class MyClass
    {       
        public void StartBook()
        {
            Console.WriteLine("打开书本");
        }
        public void ReadBook()
        {
            Console.WriteLine("开始读书");
        }
    }    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落缨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值