VB.NET学习笔记:初识委托——System.Delegate 类

想必你对生活中的“委托”耳闻能详,如委托某人办某事。没想到VB.NET编程也要跟委托打交道。因扩展控件,使其列头增加全选全不选复选框并具备分页功能需要用到委托和事件,详见博文《》、《》,所以拜读了多篇相关委托与事件的博文,结合自己在编程中的使用情况,谈谈我对委托与事件的一些认识,记录下来做个记号,温习时可以用用。
一、委托
一、问题暴露:方法能作为参数传给方法吗?
为了优化精简代码,通常会把多次重复的代码写成过程或函数,然后再调用该过程或函数,这样要修改代码就不必用到四处修改,只需对修改该过程或函数代码即可。代码示例如下:

以委托也可以实现过程或函数的调用。代码如下:
Public Class Form1

Delegate Sub fr(ByVal str As String) '创建一个委托
Dim a As New fr(AddressOf talk) '声明实例化委托并绑定被委托的方法:talk
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
a.Invoke(“hello”)'运行指定的委托即间接调用talk方法
End Sub
Public Sub talk(ByVal str As String)
MsgBox(str)

End Sub

End Class
好啰嗦的代码,真是画蛇添足,多此一举。
为了进一步暴露问题,我们把Call过程封装到一个类中,从类中调用窗体里提供的过程或函数,实现代码如下:

于是,矛盾并在类和窗体两位主人公之间展开了,窗体不满足只有英文版的“Hello World”,说要整个中文版,不容类辩驳就擅自增加了中文版的过程,要求类能根据组合框的选择调用相应版本的过程。类只能妥协,通过加IF语句来满足了窗体的要求。代码如下:

不用我说大家肯定也能猜到,窗体是不会善罢甘休,还要增加俄语版、德语版……,类只能一次次的用IF语句来满足窗体的新要求。终于有一天,类为窗体的新要求犯难了。窗体说不想调用各语种的“Hello World”了,但具体要调用什么过程又没想好,于是把所有版本的“Hello World”过程清空。没有过程名类要怎么用Call来调用过程呢?如果能把方法作为参数传递问题就有解了。代码如下:

可是VB.NET不支持这样语法。正当类犯愁时,委托出场了,并帮助类满足了窗体的要求。代码如下:

只要窗体想好了方法,就自行绑定给委托,而类不需要做任何修改,真是一劳永逸。
好了,想必读者到此也能自行总结传统的Call和委托的利弊。传统的扩展性差,最重要的是不能动态调用方法。那到底VB.NET中的委托是什么?
二、委托的概念
Visual Basic .NET 委托是基于 System.Delegate 类(更准确地说从 Systetn.MuhicastDelegate 继承而来的,而 System.MulticastDelegate 则又是从 System.Delegate 继承而来 的。)的引用类型,是CTS(公共类型系统)规定的5种类型之一(类类型、结构类型、接口类型、枚举类型、委托类型)。它能够调用对象的方法(实例方法)和类的方法(静态方法、在VB里的Shared方法)。有了委托就可以透过方法来调用指定方法,这种指定不是编译时指定的而是在程序运行时指定。
三、委托的使用
1、基本步骤
2、调用含参数过程
3、调用函数
4、调用多个方法

猜你喜欢

转载自blog.csdn.net/zyjq52uys/article/details/85621639
今日推荐