测试环境:windows 7和Microsoft Visual Studio 2015
想必你对生活中的“委托”耳闻能详,如委托某人办某事。没想到VB.NET编程也要跟委托打交道。因扩展控件,使其列头增加全选全不选复选框并具备分页功能需要用到委托和事件,详见博文《VB.NET学习笔记:WinForm自定义DataGridView分页组合控件》、《VB.NET学习笔记:自定义控件之扩展DataGridViewColumnHeaderCell类增加CheckBox全选复选框》,所以拜读了多篇相关委托与事件的博文,结合自己在编程中的使用情况,谈谈我对委托的一些认识,记录下来做个记号,温习时可以用用。
一、问题暴露:方法能作为参数传给方法吗?
为了优化精简代码,通常会把多次重复的代码写成Sub过程或Function函数,然后再调用该过程或函数,这样要修改代码就不必用到四处修改,只需对修改该Sub过程或Function函数代码即可。来个Call英文版"Hello World",代码示例如下:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Call EnglishHelloWorld()
End Sub
Private Sub EnglishHelloWorld()
MessageBox.Show("Hello World")
End Sub
End Class
以委托也可以实现过程或函数的调用。代码如下:
Public Class Form1
Private Delegate Sub HelloWorldDelegate() '创建一个委托
Dim Dlt As New HelloWorldDelegate(AddressOf EnglishHelloWorld) '声明实例化委托并绑定被委托的方法:EnglishHelloWorld
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dlt.Invoke() '运行指定的委托即间接调用EnglishHelloWorld方法
End Sub
Private Sub EnglishHelloWorld()
MessageBox.Show("Hello World")
End Sub
End Class
好啰嗦的代码,真是画蛇添足,多此一举,有必要用委托吗?直接调用不是更好?
为了把问题暴露出来,我们把 Form1_Load过程封装到一个类中,从类中调用窗体里提供的Sub过程或Function函数(以下统称方法),实现代码如下:
Public Class HelloWorld
Public Sub Form1_Load()
Dim Form As New Form1
Call Form.EnglishHelloWorld()
End Sub
End Class
窗体调用代码如下:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim Cls As New HelloWorld
Call Cls.Form1_Load()
End Sub
Public Sub EnglishHelloWorld()
MessageBox.Show("Hello World")
End Sub
End Class