委托:
?一、委托:
?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