c#委托详谈

最近小编用到了很多次的委托,就决定找个机会总结一下。

定义
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值