在 Visual Studio 中将新文件添加到 VB.Net 项目时,我可以选择“类”和“模块”。一个类被描述为
An empty class file
虽然一个模块被描述为
A file for storing groups of functions
这似乎意味着一个模块不如一个类有用,因为一个类可以存储函数组等等。
一个模块只是一组函数,还是模块比 Visual Studio 文档建议的更多?
在 Visual Studio 中将新文件添加到 VB.Net 项目时,我可以选择“类”和“模块”。一个类被描述为
An empty class file
虽然一个模块被描述为
A file for storing groups of functions
这似乎意味着一个模块不如一个类有用,因为一个类可以存储函数组等等。
一个模块只是一组函数,还是模块比 Visual Studio 文档建议的更多?
类是一种类型。您可以像使用任何其他类型 ( String
, Integer
, Date
, FileInfo
...) 一样使用此类型来声明变量、参数、属性和函数返回类型。
让我们举一个小例子:
Public Class Person
Public Property FirstName As String
Public Property LastName As String
Public Overridable Sub Print() 'I will explain Overridable later.
Console.WriteLine($"{FirstName} {LastName}")
End Sub
End Class
现在您可以声明类型的变量Person
Dim sue, pete As Person
Dim persons As List(Of Person)
sue = New Person()
sue.FirstName = "Susan"
sue.LastName = "Miller"
pete = New Person()
pete.FirstName = "Peter"
pete.LastName = "Smith"
persons = new List(Of Person)()
persons.Add(sue)
persons.Add(pete)
For Each person As Person In persons
person.Print()
Next
而模块是静态的。即存储在模块中的数据只存在一次。另一方面,您不必用 实例化模块New
,因此它们通常用于存储全局数据和全局可用的方法。例如,您可以将人员列表存储在模块中。
但是你可以用类做更多的事情。您可以从基类派生类。这个新类继承了基类的所有内容,并且可以向其添加更多内容。例如,您可以Employee
从Person
Public Class Employee
Inherits Person
Public Property Salary As Decimal
Public Overrides Sub Print
Console.WriteLine($"{FirstName} {LastName}, Salary = {Salary}")
End Sub
End Class
Overridable
关键字 in允许派生类Person.Print
重新定义(覆盖)Print
方法。(类中的函数和子类称为方法。)
员工的分配与人员兼容。您可以将员工添加到persons
列表中。这不需要对 For Each 循环进行任何更改,即调用person.Print()
自动调用正确的Print
方法(第一个用于“正常”人员,第二个用于员工)。
Dim emp as Employee
emp = New Employee()
emp.FirstName = "Frank"
emp.LastName = "Taggart"
emp.Salary = 3500.00D
persons.Add(emp)
关于类还有很多话要说。我希望你对类可以做什么有一定的了解。
请参阅Visual Basic 中的对象和类,尤其是类和模块之间的差异部分。
模块只不过是静态类的另一个名称。
这里的所有都是它的。
如果您不相信,请使用 VB.NET 编译模块并使用 C-Sharp 使用 ILSpy 进行反编译。
是的,这意味着您是正确的,就功能而言,模块是类的子集。
因此,就功能而言,类是模块的超级集,因为它可以包含静态和非静态方法和变量,以及虚拟和受保护的访问修饰符。
类更像是一个单元,而模块本质上是函数、变量甚至类等内容的松散集合。
在公共模块中,项目中的类可以访问模块的函数和变量。您不必指定模块名称来寻址一个。您还可以在模块中包含类。
类的变量和函数在类的“所有权”之下。其他类使用的公共变量和函数(方法)与类名一起使用:classname.method
与模块中的不同。
一个模块只有一个实例,但可以一次使用一个或多个类的实例。
类和模块之间的主要区别在于,类可以实例化为对象,而标准模块不能。因为标准模块的数据只有一份副本,所以当您的程序的一部分更改标准模块中的公共变量时,如果程序的任何其他部分随后读取该变量,则会获得相同的值。相反,对于每个实例化的对象,对象数据是分开存在的。另一个区别是,与标准模块不同,类可以实现接口。
来源: http: //msdn.microsoft.com/en-us/library/7825002w (en-US,VS.80).aspx
实际上,您使用类来创建对象。例如,在以下 .NET 控制台应用程序r
中是一个Rectangle
对象:
Imports System
Public Class Rectangle
Private length As Double
Private width As Double
'Public methods
Public Sub AcceptDetails()
length = 4.5
width = 3.5
End Sub
Public Function GetArea() As Double
GetArea = length * width
End Function
Public Sub Display()
Console.WriteLine("Length: {0}", length)
Console.WriteLine("Width: {0}", width)
Console.WriteLine("Area: {0}", GetArea())
End Sub
Shared Sub Main()
Dim r As New Rectangle()
r.Acceptdetails()
r.Display()
Console.ReadLine()
End Sub
End Class