当实现一个委托实例化后,可以像传递参数一样来传递这个对象。委托会把对它进行的方法调用传递给方法,调用方传递给委托的参数被传递给方法,方法的返回值由委托返回给调用方。
被委托实例所封装的方法集合被称为调用列表。当使用方法来创建委托实例时,这个委托实例会封装该方法,并将其作为调用列表内的第一个方法。
在C#中为调用委托提供了专用的语法,具体说明如下。
当调用非空、调用列表仅包含一个方法的委托实例时,会调用调用列表中的这个方法,并且委托调用所使用的参数和返回值,参数和返回值分别与该方法内的相同。
如果在调用过程中发生异常,但是在调用方法中没有捕获到异常,则会在调用委托的方法内继续检索和该异常对应的catch子句。
1.创建静态方法
在具体的项目应用中,可以使用静态方法来创建委托实例。
实例53:根据定义的实例输出对应文本
下面通过一个具体的实例来说明使用静态方法来创建委托实例的流程。本实例保存在“光盘:\daima\11”文件夹内,项目名为useweituo。实例的功能是根据定义的实例输出对应的文本。实例文件的主要代码如下所示:
在上述实例代码中,定义了委托weituo,并将委托实例mm当作参数进行了方法传递,然后通过调用静态方法chuliTitle()输出了对应的文本。具体执行结果如图12-1所示。
图12-1 实例执行结果
多学一招
委托和事件在.Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,只要是过了这个槛的人,会觉得真是太容易了。所有的委托都继承自MulticastDelegate,编译器在编译时会为委托的声明生成了一个完整的委托类。关于编译器生成的委托类及Invoke()方法的调用情况,可通过使用ILDAsm.exe查看执行文件的IL代码获得。
2.动态方法创建(www.xing528.com)
在C#开发应用中,也可以使用动态方法来创建委托实例。
实例54:使用动态方法来创建委托实例
下面通过一个具体的实例来说明使用动态方法来创建委托实例的流程。本实例保存在“光盘:\daima\11”文件夹内,项目名为usedongtai。实例的功能是根据定义的实例输出对应的文本。实例文件的主要代码如下所示:
在上述实例代码中,定义了委托weituo,并将委托实例class2作为参数进行了方法传递,然后通过调用实例方法chuli()输出了对应的文本。具体执行结果如图12-2所示。
图12-2 实例执行结果
多学一招
委托跟回调函数是很有渊源的。回调其实跟通知机制有关,考虑这样一个基本的事件序列:a对象调用了b对象的某个方法,希望b对象在其方法完成之时调用a对象的某个方法。要实现这样的过程,要求b对象持有a对象的引用(引用一般作为b对象方法的参数传入),且“知道”a对象的那个特定方法。这个方法就是所说的那个回调函数。
3.委托链
因为C#委托是多路广播的,所以可以将多个委托实例组合在一起,这样就构成了委托链。此时委托链中所有的委托调用列表被链接在一起,组成了一个新的调用列表,这个新列表包含了两个或更多的方法。在C#中,可以使用二元“+”和“+=”运算符来组合委托,可以使用一元“--”和“-=”运算符来删除委托实例。
当使用委托组合处理和删除处理后,将会生成一个新的委托。该委托有其独立的调用列表,被组合处理和删除处理后原调用列表将保持不变。
如果在一个委托实例的调用列表内包含多个方法,那么当调用此类委托实例时将会顺序执行调用列表中的各个方法。以上述方式调用的每个方法都会使用相同的参数集。
如果在参数集内包含引用或输出参数,则各个方法的调用都将使用对同一变量的引用。为此,如果调用列表内的某个方法更改了该变量,那么调用列表中排在该方法以后的所有方法所使用的参数都将随之改变。
当委托调用包含引用参数、输出参数或返回一个返回值时,那么委托调用的最后引用或输出参数的值或返回值,就是调用列表中最后一个方法所产生的引用,或输出参数的值或返回值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。