委托:
?一、委托:
?1.C#中提供委托这种构造,通过使用Delegate类即是委托类,委托实例可以封装属于可调用实体的方法。通过委托可以间接的调用一个方法(实例方法或静态方法都可以)。委托包含对方法的引用,使用委托可以在运行时动态的设定要调用的方法,执行或调用一个委托将执行该委托引用的数据.
?2.委托类型是一种引用方法的类型,而且是面向对象的、类型安全和保险的,一旦为委托分配了方法,委托将于该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值
?
?二、委托的特点;
?1.委托类似c/c++函数指针,但他是类型安全的
?2.委托允许将方法作为参数进行传递
?3.委托可用于定义回调方法
?4.委托可以链接在一起
?5.方法不需要与委托签名精确匹配
?
?三、声明,实例化,调用委托:
?1.声明:
?[修饰符] delegate 返回类型 委托类型名(参数列表);
?2.实例化委托对象
?委托类型名 委托对象名 = new 委托类型名(静态方法或实例方法);
?3.调用委托:
?委托对象名(实参列表);
?
?四、示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Proj6_9 { //委托可以封装属于调用实体的方法, //通过委托可以简洁的调用一个方法,委托包含的只是方法的细节 class Program { delegate double mydelegate(double x,double y);//申明委托类型 class MyDeClass { //申明含有方法的类 public double add(double x, double y) { return x + y; } public double sub(double x, double y) { return x -y; } public double mul(double x, double y) { return x * y; } public double div(double x, double y) { return x/y; } } static void Main(string[] args) { MyDeClass obj = new MyDeClass();//创建MyDeClass实例 //委托对象与obj.add()相关联 mydelegate p = new mydelegate(obj.add); Console.WriteLine("5+8={0}",p(5,8));//调用委托对象p p = new mydelegate(obj.sub); Console.WriteLine("5-8={0}", p(5, 8));//调用委托对象p p = new mydelegate(obj.mul); Console.WriteLine("5*8={0}", p(5, 8));//调用委托对象p p = new mydelegate(obj.div); Console.WriteLine("5/8={0}", p(5, 8));//调用委托对象p } } }
?
?五、运行结果:
?
?
?六、解释:
?上述中,先声明委托类型mydelegate,定义一个包含委托方法的类MyDeClass,其中含有4个方法,分别实现两个参数的加、减、乘和除法,
然后在主函数中定义MyDeClass类的一个对象obj并实例化,然后定义一个mydelegate委托对象p,将其实例化并分别关联到obj的4个方法,每次实例化后都调用该委托对象.
?
?七、补充:
?1.委托类delegate是密封的,不能从Delegate类中派生委托类型,也不能从派生自定义类
?2.委托类型与类有所不同,类可以包含数据,而委托包含的只是方法的细节.
原文:http://cb123456.iteye.com/blog/2213009