委托和类一样,是用户的自定义类型,区别在于类是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
由于委托是类型,所以在创建变量以及类型的对象前需要先进行声明。
delegate void MyDel(int value) ;委托的声明与方法的声明十分相似,但有两点不同:
(1)以关键字deltgate开头
(2)没有方法主体
3.声明委托变量
MyDel del1 , del2 ;4.创建委托对象
(1)使用带new运算符创建委托对象
del1=new MyDel(myclassA.M1); //实例方法del2=new MyDel(ClassB.M2); //静态方法new运算符后+委托类型名+(实例方法or静态方法)
(2)快捷语法
del1=myclassA.M1;del2=ClassB.M2;这与之前带new运算符的方式是等价的,因为方法名和对应的委托类型之间存在隐式转换。
5.委托赋值
由于委托是引用类型,所以可以通过给委托赋值来改包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收
Mydel delvar;delvar=myclassA.m1; //创建委托对象并赋值delvar=ClassB.M2; //创建新的委托对象并赋值6.组合委托
委托间合一通过额外的运算符,创造出新的委托,新的委托的方法调用列表链接了作为操作数的委托的调用列表副本
Mydel delA,delB,delC;delA=myclassA.M1;delB=ClassB.M2;delC=delA+delB; //组合调用列表7.为委托添加、删除方法
(1)添加方法
Mydel delA=myclass.M1; //创建并初始化delA+=ClassB.M2;//添加方法添加方法的本质其实就是组合委托,每次等于创建了一个新的委托,将新的委托赋值给委托变量。
(2)删除方法
delA-=myclassA.M1; //删除方法删除委托方法的时候,有如下注意事项:
若调用列表中存在多个相同方法,则会从调用列表的底部开始寻找第一个符合的方法删除
试图删除调用列表中不存在的方法没有效果
试图调用空委托会异常,需要和null作比较
8.调用委托
if(delA!=null){delA(666);}else{Console.WriteLine("Delegate is empty!")}当委托有返回值时,调用列表中最后一个方法的返回值就是委托的返回值
当委托有引用参数时,引用参数的新值会传递到下一个方法
9.匿名方法
为了避免因初始化委托,而创建仅仅使用一次的具名方法,所以有了匿名方法
匿名方法可以使用在如下情况内:
声明委托变量时放在右侧作为初始化表达式
组合委托时放在赋值语句的右侧
为委托增加事件时在赋值语句的右侧
匿名方法语法如下:
delegate (参数){语句块} ;
可以发现匿名方法并没有返回值类型,但在实现代码时,比如根据匹配的委托类型,返回相应的返回值
匿名方法的参数必须在以下几点上与委托匹配:
参数数量
参数类型以及位置
修饰符,params参数除外,匿名方法中忽略关键字params
当匿名方法满足以下两点的时候,可以使用()或者空白来代替参数:
委托的参数列表不包含out参数
匿名方法不使用任何参数
10.Lambda表达式
在C#3.0中引入了Lambda表达式来替代匿名方法,=>读作goes to
Mydel del1 = delegate (int i){return i+1 ;};等价于Mydel del1 = (int i) =>{return i+1;};
当参数列表中不包含ref以及out参数时,可以省略参数类型,称为隐式参数
当参数中仅包含一个隐式参数,可以省略参数外的()
新闻热点
疑难解答