C#委托及事件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#委托及事件
在C#中,委托(delegate)是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。
简单的讲委托(delegate)是一种类型安全的函数指针,首先,看下面的示例程序,在C++中使用函数指针。
首先,存在两个方法:分别用于求两个数的最大值和最小值。
int Max(int x,int y)
{
return x>y?x:y;
}
int Min(int x,int y)
{
return x
}
上面两个函数的特点是:函数的返回值类型及参数列表都一样。那么,我们可以使用函数指针来指代这两个函数,并且可以将具体的指代过程交给用户,这样,可以减少用户判断的次数。
下面我们可以建立一个函数指针,将指向任意一个方法,代码如下所示:
//定义一个函数指针,并声明该指针可以指向的函数的返回值为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
}
窗口中的代码,如下图所示:
下一步:为了使用委托来实现动态指向,我们需要建立一个委托类“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 );
}
运行的效果如下图所示:
求最大值