目录
一、什么是委托
1、委托(Delegate) 是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法,所有的委托(Delegate)都派生自 System.Delegate 类。
2、我们可以认为委托是持有一个或多个方法的对象,在正常情况下我们不会想要执行一个对象,但是委托于典型的对象不同,可以执行委托,这是委托执行它所“持有”的方法。
3、举例:(代码如下)
Delegate void MyDel (int value);//声明一个委托类型
4、我的理解是:
对某件事情我自己不能或不方便去做,就把这件事情托付给别人或别的机构去办理,这就是委托。
二、委托概述
1、委托和类是一样的,是一种用户自定义的类型,但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
2、类和委托的比较:(如图)
3、我们还可以将delegate看做一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型
三、声明委托类型
1、实例代码:(如下)
Delegate void MyDel(int X);
(1)关键字:delegate
(2)返回类型:void
(3)委托类型名:MyDel
(4)签名:int X
注意:返回类型和签名指定了委托接受的方法形式
2、虽然委托类型声明看上去和方法的声明一样,但是它不需要再类内部声明,因为它是类型声明。
四、创建委托对象
1、委托类型在声明后,我们可以声明变量并创建类型的对象,变量声明如下:
MyDel delVar;
(1)委托类型:MyDel
(2)变量:delvar
2、创建委托对象的方式
(1)使用new运算符的对象创建表达式,代码如下:
delVar = new MyDel(myInstObj.MyM1);//创建委托并保存引用
dVar = new MyDel(Sclass.OtherM2);//创建委托并保存引用
(2)快捷语法,代码如下:
delVar = myInstObj.MyM1;//创建委托并保存引用
dVar = Sclass.OtherM2;//创建委托并保存引用
注意:这个方法和之前是一样的,这个快捷语法能工作是因为在方法名称和其相应的委托类型之间存在隐式转换。
(3)创建委托的方法
//实例方法
delVar = new MyDel(myInstObj.MyM1);//创建委托并保存引用
//静态方法
dVar = new MyDel(Sclass.OtherM2);//创建委托并保存引用
五、给委托赋值
1、由于委托是引用类型的,所以我们可以通过给他赋值来改变包含在委托变量中的引用。
2、具体赋值:(代码如下)
delVar = myInstObj.MyM1;//创建委托对象并赋值
……
dVar = Sclass.OtherM2;//创建新的委托对象并赋值
六、为委托添加方法
1、这里主要使用+=运算符添加委托
2、具体添加方法,代码如下:
//老板胡汉三
Boss huhansan = new Boss();
//看股票的同事
StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
//看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);
huhansan.Update += new EventHandler(tongshi2.CloseStockMarket);
huhansan.Update += new EventHandler(tongshi2.CloseNBADirectseeding);
//老板回来
huhansan.SubjectState = "我胡汉三回来了!";
//发出通知
huhansan.Notify();
七、为委托移除方法
1、这里主要使用-=运算符添加委托
2、具体添加方法,代码如下:
//老板胡汉三
Boss huhansan = new Boss();
//看股票的同事
StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
//看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);
huhansan.Update -= new EventHandler(tongshi2.CloseStockMarket);
huhansan.Update -= new EventHandler(tongshi2.CloseNBADirectseeding);
//老板回来
huhansan.SubjectState = "我胡汉三回来了!";
//发出通知
huhansan.Notify();
八、总结
就目前为止,我的总结也就仅仅知道了委托是怎么一回事,还有很多很多的地方需要多多的实践,这里谈不上什么全面,只是自己学习过程中的点滴积累,还望各位大神指点一二。