最近小编用到了很多次的委托,就决定找个机会总结一下。
定义
C#委托类似于C或C++中函数的指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。委托特别用于实现事件和回调方法。
声明委托
格式:
public delegate 类型 函数名(参数类型 参数名)
例:
public delegate int MyDelegate(string s);
internal delegate void FeedBack(int value);
上面的第一个委托可被用于引用任何一个带有单一的string参数的方法,并返回一个int类型的变量。
上面的第二个委托可被用于引用任何一个带有单一的int参数的方法,并且没有返回值。
实例化委托
MyDelegate md1=new MyDelegate(WriteToConsole);
下面来一个简单的示例
//声明委托
public delegate int NumberChanger(int n);
class Test{
static int num=10;
public static int AddNum(int p){
num=num+p;
return num;
}
public static int MultNum(int q){
num=num*q;
return num;
}
public static int getNum(){
return num;
}
public static void Main(string[] args){
//创建委托实例
NumberChanger nc1=new NumberChanger(AddNum);
NumberChanger nc2=new NumberChanger(MultNum);
//使用委托对象调用方法
nc1(20);
Console.WriteLine("num={0}",getNum());
nc2(3);
Console.WriteLine("num={0}",getNum());
}
}
运行结果:
num=30
num=90
委托的多播
委托对象可以使用“+”或“-”运算符进行合并。因为这个特性,就可以创建一个委托被调用时要调用的方法的调用列表,这就是多播。
话不多说,代码来实现:
public class MrHou{
public void buyTicket(){
Console.WriteLine("买车票");
}
public void buyMovieTicket(){
Console.WriteLine("买电影票");
}
}
class MissHou{
//声明委托
public delegate void mydelegate();
public static void Main(string[] args){
//实例化委托
mydelegate md;
mydelegate md1=new mydelegate(MrHou.buyTicket);
mydelegate md2=new mydelegata(MrHou.buyMovieTicket);
md=md1;
md=md1+md2;
md();
运行结果:
买车票
买电影票
委托的应用
委托可以理解为让别人帮你办一件事情,是C#实现回调函数的一种机制。
举个例子:我是一家公司的老板,公司现在在招聘.NET工程师,我们有一个小姐姐专门负责接受求职者投递的简历,我就告诉小姐姐,一旦收到新的简历就转发给 我一份。
这个例子里小姐姐要做的工作:给我转发一份简历(回调函数里的操作),就是一个回调函数的作用。一旦有了满足条件(收到了新的简历),小姐姐就会转发给我(触发回调函数)。
实例:
class Program{
//声明委托
internal delegate void FeedBack(int value);
static void Main(string[] args){
InstanceDelegateDemo();
Console.ReadKey();
}
//实例调用
private static void InstanceDelegateDemo(){
Program p=new Program();
Counter(1,10,null); //因为委托为null,所以没有反馈
Counter(1,5,new FeedBack(p.InstanceFeedBackToConsole));
}
//实例回调方法
private void InstanceFeedBackToConsole(int value){
Console.WriteLine("Item= "+value);
}
//编写一个方法来触发委托回调
private static void Counter(int start,int finish,FeedBack fb){
for(int val=start;val<finish;val++){
if(fb != null){
fb(val);
} //fb?.Invoke(val) 简化版本调用
}
}
}
运行结果:
Item= 1
Item= 2
Item= 3
Item= 4
Item= 5