一、委托
在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("开始读书");
}
}
}