C#之委托

本文介绍了.NET中委托的原理、类型安全特性,如何使用lambda表达式、多播委托以及匿名方法的优点和使用限制。讲述了Action<T>和Func<T>的不同之处,以及在处理异常和迭代时的注意事项。
摘要由CSDN通过智能技术生成

委托是寻址方法的.NET版本。

委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对方法的引用,也可以包含对多个方法的引用。

当参数是委托类型时,就可以使用lambda表达式实现委托引用的方法。

委托只是一种特殊类型的对象,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托包含的只是一个或多个方法的地址。

委托的使用:首先必须定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托表示哪种类型的方法。然后,必须创建该委托的一个或多个实例。编译器在后台将创建表示该委托的一个类。声明委托的语句如下:

delegate void IntMethodInvoker(int x);

委托的类型安全性非常高,在定义委托时,必须给出它所表示的方法的签名和返回类型等全部细节。

理解委托的一种好方式是把委托视为给方法的签名和返回类型指定名称。

定义委托基本上是定义一个新类,所以可以在定义类的任何相同地方定义委托。即,可以在另一个类的内部定义委托,也可以在任何类的外部定义,还可以在名称空间中把委托定义为顶层对象。根据定义的可见性和委托的作用域,可以在委托的定义上应用任意常见的访问修饰符:public、private、protected等:public delegate string GetAString();

当定义好委托后,就可以创建它的一个实例,从而用该实例存储特定方法的细节。

C#中,委托在语法上总是接受一个参数的构造函数,这个参数就是委托引用的方法。这个方法必须匹配最初定义委托时的签名。

给定委托的实例可以引用任何类型的任何对象上的实例方法或静态方法,只要方法的签名匹配委托的签名。

在C#中,一个委托可以引用多个方法,只要这些方法的签名(即参数类型和返回类型)与委托的签名匹配。委托的签名定义了委托方法的返回类型、方法名称和参数列表。当使用委托时,可以将多个方法分配给委托变量,只要这些方法的签名与委托的签名相匹配。

Action<T>

泛型Action<T>委托表示引用一个void返回类型的方法。这个委托类存在不同的变体,可以传递至多16种不同的参数类型。没有泛型参数的Action类可调用没有参数的方法。Action<in T>调用带一个参数的方法,Action<in T1, in T2>调用带两个参数的方法,Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8>调用带8个参数的方法。

Func<T>

Func<T>允许调用带返回类型的方法。与Action<T>类似,Func<T>也定义了不同的变体,至多也可以传递16个参数类型和一个返回类型。Func<out TResult>委托类型可以调用带返回类型且无参数的方法,Func<in T, outTResult>调用带一个参数的方法,Func<in T1, in T2, in T3, in T4, out TResult>调用带4个参数的方法。

多播委托

如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回void;否则,就只能得到委托调用的最后一个方法的结果。

我们可以使用返回类型为void的Action<T>委托

Action<double> action=MathOperations.MultiplyByTwo; action += MathOperations.Square;

注:前面的方法抛出异常后 就停止 不会继续进行

为了避免这个问题,应自己迭代方法列表:

Delegate类定义GetInvocationList()方法,它返回一个Delegate对象数组。现在可以使用这个委托调用与委托直接相关的方法,捕获异常,并继续下一次迭代。

匿名类型

匿名方法的使用优点是减少了要编写的代码。不必定义仅由委托使用的方法。

这有助于降低代码的复杂性,尤其是在定义了好几个事件时,代码会显得比较简单。

使用匿名方法时,必须遵循两条规则。在匿名方法中不能使用跳转语句(break、goto或continue)跳到该匿名方法的外部,反之亦然:匿名方法外部的跳转语句不能跳到该匿名方法的内部;在匿名方法内部不能访问不安全的代码。另外,也不能访问在匿名方法外部使用的ref和out参数。但可以使用在匿名方法外部定义的其他变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a_dafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值