可以认为委托是持有一个或多个方法的对象。当然,正常情况下你不想“执行”一个对象,但委托与典型对象不同。可以执行委托,这时委托会执行它所“持有”的方法。
委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
使用步骤:
- 声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块
- 使用该委托类型声明一个委托变量
- 创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致
- 你可以选择为委托对象增加其他方法。这些方法必须与第一步中定义的委托类型有相同的签名和返回类型
- 在代码中你可以像调用方法一样调用委托。在调用委托时,其包含的每个方法都会被执行
你可以把delegate看做一个包含有序方法列表的对象,这些方法的签名和返回类型相同。
声明委托类型
与类一样,委托类型必须在被用来创建变量以及类型的对象前声明。声明格式如下。
关键字 委托类型名 ↓ ↓ delegate void MyDel(int x); ↑ ↑ 返回类型 签名
给委托赋值
MyDel delvar; delVar=myInstObj.MyM1; ... delVar=SClass.OtherM2;
组合委托
MyDel delA=myInstObj.MyM1; MyDel delB=SClass.OtherM2; MyDel delC=delA+delB;
为委托添加方法
尽管通过上一节我们知道委托是恒定的,不过C#提供了看上去可以为委托添加方法的语法,即使用+=运算符。
例:为委托的调用列表增加两个方法。
MyDel delVar=inst.MyM1; delVar+=SCL.m3; delvar+=X.Act;
当然,使用+=运算符时,实际发生的是创建了一个新的委托,其调用列表是左边的委托加上右边的组合。然后将这个新的委托赋值给delVar。
从委托移除方法
我们可以使用-=运算符从委托移除方法。delVar-=SCL.m3;
调用委托
可以像调用方法一样简单地调用委托。调用委托的参数将会用于调用列表中的每个方法(除非有输出参数,我们稍后介绍)。例:delVar委托接受一个整数值。使用参数调用委托会使用相同的参数值调用它调用列表中的每个成员
MyDel delVar=inst.MyM1; delVar+=SCL.m3; delVar+=X.Act; ... delVar(55)
如果一个方法在调用列表中出现多次,当委托被调用时,每次在列表中遇到该方法时它都会被调用一次。