今天学习VB.NET,发现VB.NET里面有一个Module的东西,如下图(图-1)所示:
图-1
上网查了一下VB.NET里面的Module,才发现这是学习VB.NET遇到的第一个典型的问题就是:为什么VB.NET中会有一个Module的东西,而在C#等语言中是没有的呢?
首先,这是一个历史原因。早先的VB语言都有模块和类模块的概念。所谓模块一般就是存放公用的一些方法(Sub)或者函数(Function),而类模块,相当于就是我们经常所说的类的概念。
模块(Module)里面可以直接有方法,这些方法自动就是静态的(或者称为共享的——VB.NET中的关键字是Shared),这些方法可以直接调用,所以Module是无法实例化,也没有必要实例化的。
模块无法继承,也无法实现接口。
模块里面可以有类,但其实这个类并不需要真的通过模块作为前缀来引用。所以模块有点虚的概念
模块可以被组织到命名空间中去,因为模块其实是个虚的,所以它的方法也可以直接外层的命名空间调用
Module代码范例:
1 '用命名空间封装Module 2 Namespace VBModuleTest 3 ''' <summary> 4 ''' 模块无法继承,无法实现接口 5 ''' </summary> 6 ''' <remarks></remarks> 7 Module ModuleTest 8 ''' <summary> 9 ''' 模块里面的方法都是静态的,无需实例化,也无从实例化 10 ''' </summary> 11 ''' <remarks></remarks> 12 Sub Main() 13 'new一个Class1实例 14 'Dim clazz As Class1 = New Class1这样也是对的 15 Dim clazz As Class1 = New Class1() 16 clazz.Name = "Class1类" 17 Console.WriteLine(clazz.Name) 18 Console.WriteLine(clazz.GetClassName()) 19 Console.ReadKey() 20 End Sub 21 ''' <summary> 22 ''' 有返回值的方法,用Function来声明 23 ''' </summary> 24 ''' <returns></returns> 25 ''' <remarks></remarks> 26 Public Function Test1() As String 27 Console.WriteLine("这个是Module里面的Test1方法") 28 Return "" 29 End Function 30 ''' <summary> 31 ''' 无返回值的方法,用Sub来声明 32 ''' </summary> 33 ''' <remarks></remarks> 34 Public Sub Test2() 35 Console.WriteLine("这个是Module里面的Test2方法") 36 End Sub 37 38 ''' <summary> 39 ''' 类型可以放在模块里面,但主要的现实意义在于分类存放而已,放在模块里面并不影响该类型对外的引用。 40 ''' 例如我们并不一定需要用VBModuleTest.ModuleTest.Class1, 41 ''' 而是直接通过VBModuleTest.Class1就可以对其进行引用 42 ''' </summary> 43 ''' <remarks></remarks> 44 Public Class Class1 : Implements IComparable 45 ''' <summary> 46 ''' 声明属性 47 ''' </summary> 48 ''' <remarks></remarks> 49 Private _name As String 50 Public Property Name() As String 51 Get 52 Return _name 53 End Get 54 Set(ByVal value As String) 55 Me._name = value 56 End Set 57 End Property 58 59 ''' <summary> 60 ''' 声明方法 61 ''' </summary> 62 ''' <returns></returns> 63 ''' <remarks></remarks> 64 Public Function GetClassName() As String 65 Test1() 66 ModuleTest.Test2() 67 Return Me.GetType().ToString() 68 End Function 69 70 ''' <summary> 71 ''' 实现接口中的方法 72 ''' </summary> 73 ''' <param name="obj"></param> 74 ''' <returns></returns> 75 ''' <remarks></remarks> 76 Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo 77 Return 1 78 End Function 79 End Class 80 End Module 81 End Namespace
这里的代码只是纯粹为演示目的而写的,没有任何具体意义 。