C# Delegate
委托:
Delegate:具有相同参数和返回值(签名)的一类函数声明,这样比较通俗易懂
一:多播委托
调用一个委托,同时可以执行多个方法(自定义事件中最为常见),多路广播委托派生于System.MulticastDelegate,它的Combine方法允许把多个方法调用链接在一起,我们可以通过+=来向委托添加调用方法,也可以用-=删除其中的调用方法。
class Program { //定义个委托方法 private delegate int Mydelegate(int x, int y); static void Main(string[] args) { Mydelegate myDelegate = new Mydelegate(Sum); myDelegate += new Mydelegate(Subtract);//把两个方法合并到一个多播委托中 int c = myDelegate(5, 1);//只需执行一个方法 Console.WriteLine("返回结果为最后一次执行结果:"+c+"\n"); //按照调用顺序,返回此多路广播委托的调用列表 Delegate[] myDelegateArr = myDelegate.GetInvocationList(); foreach (Delegate d in myDelegateArr) { int result=((Mydelegate)d).Invoke(5, 1); Console.WriteLine("结果:"+result); } Console.ReadKey(); } //加 private static int Sum(int a, int b) { Console.WriteLine("执行了Sum方法"); return a + b; } //减 private static int Subtract(int a, int b) { Console.WriteLine("执行了Subtract方法"); return a - b; } }
结果:
注:多路广播委托声明时必须返回void,否则返回值不知道应该送回什么地方,但是从上面的例子中可以发现,如果不将委托的声明返回void,则返回值返回的是最后一个链入委托链的方法的返回值,如果要返回多个结果,调用方法GetInvocationList(),返回委托数组,再进行调用。
二:匿名委托
class Program { //定义个委托方法 private delegate int Mydelegate(int x, int y); static void Main(string[] args) { //匿名委托 Mydelegate md=delegate(int a,int b){ return a+b; }; int result = md(5,7); Console.WriteLine(result); Console.ReadKey(); } }
接口和委托的区别:转自:http://blog.csdn.net/nuaalfm/article/details/1739746
接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。接口(interface)是向客户承诺类或结 构体的行为方式的一种合同,当实现某个接口时,相当于告诉可能的客户:“我保证支持这个接口的方法,属性等”,接口不能实例化,接口只包含成员定义,不包 含成员的实现,成员的实现需要在继承的类或者结构中实现。
C#中的委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样具有参数和返回值。委托对象能被传递给调用该方法引用的代码而无须知道哪个方法将在编译时被调用。
从定义上来看似乎委托和接口没什么相似之处,但从隔离变化这个角度来看他们倒是有些相似之处,所以这里我们把他们放到一起来比较一番。
委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法 签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?
在以下情况中使用委托:
1、当使用事件设计模式时。委托是事件的基础,当需要某个事件触发外界响应时,使用委托事件比较合适。
2、当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
3、需要方便的组合,使用委托可以利用+=,-=方便的组合方法。
4、当类可能需要该方法的多个实现时,使用多播委托。
在以下情况中使用接口:
1、当存在一组可能被调用的相关方法时。
2、当类只需要方法的单个实现时。
3、当使用接口的类想要将该接口强制转换为其他接口或类类型时。
4、当正在实现的方法链接到类的类型或标识时:例如比较方法。
使用单一方法接口而不使用委托的一个很好的示例是 IComparable 或 IComparable。IComparable 声明 CompareTo 方法,该方法返回一个整数,以指定相同类型的两个对象之间的小于、等于或大于关系。IComparable 可用作排序算法的基础,虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,而比较算法不会在运行时改变,所以单一 方法接口是理想的。
浙公网安备 33010602011771号