没有合适的资源?快使用搜索试试~ 我知道了~
C# 委托使用方法.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
7 浏览量
2021-12-22
16:35:16
上传
评论
收藏 2.18MB PDF 举报
。。。
资源推荐
资源详情
资源评论










在 C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是
函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象
实例的引用。
简单的讲委托(delegate)是一种类型安全的函数指针,首先,看下面的示例程
序,在 C++中使用函数指针。
首先,存在两个方法:分别用于求两个数的最大值和最小值。
int Max(int x,int y)
{
return x>y?x:y;
}
int Min(int x,int y)
{
return x<Y?X:Y;< font>
}
上面两个函数的特点是:函数的返回值类型及参数列表都一样。那么,我们可以
使用函数指针来指代这两个函数,并且可以将具体的指代过程交给用户,这样,
可以减少用户判断的次数。
下面我们可以建立一个函数指针,将指向任意一个方法,代码如下所示:
//定义一个函数指针,并声明该指针可以指向的函数的返回值为 int 类型,参
数列表中包//括两个 int 类型的参数
int (*p)(int,int);
//让指针 p 指向 Max 函数
p=max;
//利用指针调用 Max
c=(*p)(5,6);
我们的问题在于,上面的代码中,为什么不直接使用 Max 函数,而是利用一个
指针指向 Max 之后,再利用指针调用 Max 函数呢?
实际上,使用指针的方便之处就在于,当前时刻可以让指针 p 指向 Max,在后面
的代码中,我们还可以利用指针 p 再指向 Min 函数,但是不论 p 指向的是谁,
调用 p 时的形式都一样,这样可以很大程度上减少判断语句的使用,使代码的可
读性增强!
在 C#中,我们可以使用委托(delegate)来实现函数指针的功能,也就是说,我
们可以像使用函数指针一样,在运行时利用 delegate 动态指向具备相同签名的方
法(所谓的方法签名,是指一个方法的返回值类型及其参数列表的类型)。
6.1 使用委托(delegate)
6.1.1 委托的建立
建立委托(delegate),过程有点类似于建立一个函数指针。过程如下:
1. 建立一个委托类型,并声明该委托可以指向的方法的签名(函数原型)

delegate void MyDelegate(int a,int b);
2.建立一个委托类的实例,并指向要调用的方法
//利用委托类的构造方法指定,这是最为常见的一种方式
MyDelegate md=new MyDelegate(Max);
//利用自动推断方式来指明要调用的方法,该形式更类型于函数指针
MyDelegate md=Max;
3.利用委托类实例调用所指向的方法
int c=md(4,5);
下面通过实例来演示 C#中委托的使用。
案例操作 020601:利用委托实现
方法的动态调用
首先,添加如下控件:
两个 RadioButton,分别用来让用户
选择求最大值以及求最小值
二个 TextBox,用来输入两个操作数
一个 TextBox,用来显示运算结果
一个 Button,用来执行运算
界面如下图所示:
下一步,在窗口中添加两个方法:Max,Min,这两方法的代码如下:
int Max(int x,int y)
{
return x>y?x:y;
}
int Min(int x,int y)
{
return x<Y?X:Y;< font>
}
窗口中的代码,如下图所示:

下一步:为了使用委托来实现动态指向,我们需要建立一个委托类“MyDelegate”,
并建立该委托类型的一个实例,如下图所示:
上面的代码中,我们可以发现,此时,还没有让 MyDelegate 类型的实例“md”指
向任何一个方法(即:md 的值为 null),原因是:在编写代码的时候,我们还
不知道用户想要调用哪一个方法。
下一步,分别为两个 RadioButton 编写它们的“CheckedChanged”事件,代码如下:
private void rbtMax_CheckedChanged(object sender, EventArgs
e)
{
if (this.rbtMax .Checked ==true)
{
this.md = new MyDelegate(this.Max );
}
}
private void rbtMin_CheckedChanged(object sender, EventArgs
e)
{

if (this.rbtMin .Checked ==true)
{
this.md = new MyDelegate(this.Min );
}
}
这段代码是,如果用户选择了求最大值的 RadioButton,则让 MyDelegate 类型的
实例 “md”指向 Max 方 法,如 果用户 选择了 求最小 值的 RadioButton,则让
MyDelegate 类型的实例“md”指向 Min 方法。这样作的目的,就是要把选择的过
程交给用户。
下一步,我们为界面中的 Button 编写 Click 事件,并利用委托来调用求最值的方
法。代码如下所示:
private void btGetResult_Click(object sender, EventArgs e)
{
if (this.md ==null )
{
MessageBox.Show("委托 md 没有指向任何方法!");
return;
}
int a = int.Parse(this.tbxOP1 .Text );
int b = int.Parse(this.tbxOP2 .Text );
int c = this.md(a,b);
this.tbxResult.Text = c.ToString();
}
从上面的代码中,可以发现,在使用委托之前,先要判断其值是否为空,如果不
为空,则可以进行调用,同时,使用者可以看到,在调用 md 时,我们并没有关
心 md 到底指向了哪一个方法,总之, md 不为空的时候,就一定会指向 Max 和
Min 当中的一个。
为了让求最大值的 RadioButton 在程序开始运行的时候就被选中,在Form 的 Load
事件中添加如下代码:
private void Form1_Load(object sender, EventArgs e)
{
this.md = new MyDelegate(this.Max );
}
运行的效果如下图所示:

求最大值
求最小值
委托使用的注意事项
在 C#中,所有的委托都是从
System.MulticastDelegate 类派生的。
委托隐含具有 sealed 属性,即不能
用来派生新的类型。
委托最大的作用就是为类的事件绑
定事件处理程序。
在通过委托调用函数前,必须先检
查委托是否为空(null),若非空,才
能调用函数。
在委托实例中可以封装静态的方法
也可以封装实例方法。
在创建委托实例时,需要传递将要
映射的方法或其他委托实例以指明委托
将要封装的函数原型(.NET 中称为方法
签名:signature)。注意,如果映射的
是静态方法,传递的参数应该是类名.方
法名,如果映射的是实例方法,传递的
参数应该是实例名.方法名。
只有当两个委托实例所映射的方法
以及该方法所属的对象都相同时,才认
为它们是想等的(从函数地址考虑)。
6.1.2讨论委托类型
从上面的案例中,我们可以发现,在使用委托之前,先要定义一个委托类型,如
下所示:
delegate int MyDelegate(int a, int b);
MyDelegate md = null;
既然叫做委托类型,就说明 MyDelegate 实际上是一个类,上面的写法只是一种
简 单 的 缩 略 写 法 , 实 际 上 , 我 们 自 己 定 义 的 委 托 , 都 是 继 承 自
System.MulticastDelegate 类 的 , 但 是 我 们 确 不 能 自 己 定 义 一 个 类 去 继 承 自
System.MulticastDelegate 类,为了证明这点,我们可以使用 ildasm 工具,来查看
“MyDelegate”的 IL 代码。
剩余40页未读,继续阅读
资源评论

苦茶子12138
- 粉丝: 5171
- 资源: 9万+

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
