这些天来,我一直在看委托;
MSDN上看了看关于委托的文章,越看越糊涂了;
没有办法,只好用GOOGLE多搜几种解释委托的方法来看看,以及翻了翻写得比较详细的一些书籍。
力求搞懂这个委托,和学会使用委托
委托,到底什么呢?
很多书上和网络文章上都说:
C#中的委托,就相当于C/C++中的函数指针;但是C#是一种类型安全语言;在一般情况下不允许使用指针;
而委托的出现刚刚好弥补了这一缺陷,委托是类型安全操作;
如何使用委托呢?
委托的使用分为三步(也有说委托实际相当于一种特殊的类):委托声明,委托实例化,委托调用
下面我写一个简单的委托实例;也许这个实例不用委托实现也能完成,但我的目的只是为了明白如何使用委托而以
namespace Bino
... {
delegate int NumOpe(int a,int b); //委托声明
class Demo
...{
static void Main(string[] args)
...{
Demo d = new Demo();
NumOpe p1 = new NumOpe(d.Add); //委托实例化
Console.WriteLine(p1(1,2)); //委托调用
Console.ReadLine();
}
private int Add(int num1,int num2)
...{
return(num1+num2);
}
}
}
例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:
1、参数个数、类型、顺序必须完全一致。
2、返回值必须一致
事件其实就是委托的一种;
有事件,就会有对事件进行处理的方法,而事件和处理方法之间是怎么联系起来的呢?委托就是他们中间的桥梁,事件发生时,委托会知道,然后将事件传递给处理方法,处理方法进行相应处理。
在WinForm和WebForm中最常见的是按钮的Click事件,它是这样委托的:this.button1.Click += new System.EventHandler(this.button1_Click);按按钮后就会出发button1_Click方法进行处理。EventHandler就是系统类库里已经声明的一个委托。
还有今天在CSDN上也看到一个关于委托链的文章
... {
private string name;
public Demo(string str)
...{
this.name = str;
}
public void Test()
...{
...//代码体略
}
}
Demo类有一个方法Test(),对他的实例来说A,B,C都有自己Test
a = new Demo( " AAA " );
b = new Demo( " BBB " );
c = new Demo( " CCC " );
假如这里通过定义委托来调用Test;
如果想调用a.Test();
就可以通过
// 同样b,c也要这样;
Test bTest = new Test(b.Test);
Test cTest = new Test(c.Test);
这个时候,如果想要a,b,c的Test共同执行的话,就要再定义一个复合委托;
//c#中通过“+“将方法Connect到委托,即将委托加到委托链中
//通过“-”将方法从委托链中删除
AllToTest = aTest+bTest+cTest;
看到+号应该不陌生,感觉在哪见过吧;
.net中的事件机制就是通过委托来实现的。
所以经常会看到这个+号;