首页 > 学院 > 开发设计 > 正文

【C#学习笔记】--委托

2019-11-10 19:50:05
字体:
来源:转载
供稿:网友

1. 什么是委托

委托和类一样,是用户的自定义类型,区别在于类是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。

2. 委托的声明

由于委托是类型,所以在创建变量以及类型的对象前需要先进行声明。

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参数时,可以省略参数类型,称为隐式参数

当参数中仅包含一个隐式参数,可以省略参数外的()


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表