重庆市建筑网站建设四川网站seo
一.委托
1.委托概述:
(1)声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块。
(2)使用该委托类型声明一个委托变量
(3)创建委托类型的对象,把它赋值给委托变量。新的委托对象包括指向某个方法的引用,这个方法和第一步定义的签名和返回类型一致。
(4)选择为委托对象增加其他方法,这些方法必须与第一步中定义的委托类型有相同的签名和返回类型。(这些方法可以来自于任何类或结构)
(5)调用委托(像调用方法一样调用委托),在调用委托的时候,其包含的每一个方法都会被执行。
2.声明委托类型
[访问修饰] delegate void MyDel (int x);// 访问修饰符 关键字 返回类型 委托类型名 签名
返回类型和签名指定了委托接受的方法的形式,例如:上面的声明指定了MyDel类型的委托只接受没有返回值并且有单个int参数的方法。
注意点:
(1)以delegate关键字开头;
(2)没有方法主体;
(3)委托是类型,与class同级,所以可定义在类外。
3.创建委托对象
委托类型的变量的声明
MyDel delVar;//委托类型 变量
创建委托对象的两种方式
(1)使用new运算符创建委托对象,new运算符的操作数组成如下:
委托类型名;
一对圆括号,其中包含作为调用列表中第一个成员的方法的名字。方法可以是实例方法,也可以是静态方法。
注释:可以把delegate看做一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。方法的列表称为调用列表。
注意点:调用列表中的方法可以是实例方法也可以是静态方法。
在调用委托的时候,会执行调用列表中的所有方法。
//创建委托并保存引用
delVar=new MyDel(myInstObj.MyM1);//这里是实例方法
//创建委托并保存引用
dVar=new MyDel(SClass.OtherM2);//这里是静态方法
(2)仅有方法名构成。
delVar=myInstObj.MyM1;//创建委托并保存引用
dVar=SClass.OtherM2;//创建委托并保存引用
还可以使用初始化语法在同一条语句中创建变量和初始化对象。
MyDel delVar=new MyDel(myInstObj.MyM1);
MyDeldVar=new MyDel(SClass.OtherM2);
或者
MyDel delVar=myInstObj.MyM1;
MyDeldVar=SClass.OtherM2;
4.组合委托
MyDel delA=myInstObj.MyM1;
MyDel delB=SClass.OtherM2;
MyDel delC=delA+delB;//组合调用列表
第三个是组合委托,委托是恒定的。委托对象被创建后不能再被改变
5.为委托添加方法
为委托添加方法使用“+=”运算符,如下代码为委托的调用列表“增加”了两个方法,方法加在了调用列表的底部。
MyDel delVar=myInstObj.MyM1;//创建并初始化
delVar+=SCL.m3;//增加方法
delVar+=X.Act;//增加方法
使用“+=”运算符,实际发生的是创建了一个新委托。
6.从委托移除方法
使用“-=”运算符,从委托移除方法,实际发生的也是创建了一个新委托。
delVar-=X.Act;//增加方法
注意事项:
如果再调用列表中的方法有多个实例,-=运算符将从列表最后开始搜索,并且移除第一个与方法匹配的实例;
试图删除委托中不存在的方法没有效果;
试图调用空委托会抛出异常,可以通过把委托和null进行比较来判断委托的调用列表是否为空。如果调用列表为空,则委托是null.
7.调用委托
像调用方法一样简单地调用委托。(如果一个方法在调用列表中出现多次,当委托被调用时,每次在列表中遇到这个方法时它都会被调用一次。)
调用带返回值的委托,如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况:
调用列表中最后一个方法返回的值就是委托调用返回的值;
调用列表中所有其他方法的返回值都会被忽略