在Visual Studio中向VB.Net项目添加新文件时,我可以选择“类”和“模块”。一个类被描述为
An empty class file
虽然模块被描述为
A file for storing groups of functions
这似乎意味着一个模块对一个类来说没那么有用,因为一个类可以存储一组函数等等。
是不是模块只是一组功能,或者模块是否比Visual Studio文档建议的更多?
答案 0 :(得分:13)
类是一种类型。您可以像使用任何其他类型(String
,Integer
,Date
,FileInfo
...)一样使用此类型来声明变量,参数,属性和函数返回类型。< / p>
让我们举个例子:
Public Class Person
Public Property FirstName As String
Public Property LastName As String
Public Overridable Sub Print() 'I'll explain Overridable later.
Console.WriteLine("{0} {1}", 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("{0} {1}, Salary = {2}", FirstName, LastName, Salary)
End Sub
End Class
Overridable
中的Person.Print
关键字允许派生类重新定义(覆盖)Print
方法。 (类中的函数和子类称为方法。)
员工与人员兼容。您可以将员工添加到persons
列表中。这不需要For Each循环中的任何更改,即person.Print()
的调用会自动调用正确的Print
方法(第一个用于“普通”人员,第二个用于员工)。 / p>
Dim emp as Employee
emp = New Employee()
emp.FirstName = "Frank"
emp.LastName = "Taggart"
emp.Salary = 3500.00D
persons.Add(emp)
关于课程还有很多话要说。我希望你对课程能做些什么有所了解。
答案 1 :(得分:6)
一个类更像是一个单元,一个模块本质上是函数,变量甚至类等东西的松散集合。
在公共模块中,项目中的类可以访问模块的函数和变量。您不必指定模块名称来解决问题。您还可以在模块中使用类。
班级的变量和功能受到班级更严格的“所有权”。其他类使用的公共变量和函数(方法)与类名:classname.method
一起使用,与模块中的不同。
模块只有一个实例,但一次可以使用一个或多个类的实例。
答案 2 :(得分:6)
模块只不过是静态类的另一个名称。
这就是它的全部内容。
如果您不相信,请使用VB.NET编译模块,并使用C-Sharp使用ILSpy进行反编译。
是的,这意味着你要正确,就功能而言,模块是一个类的SUBset。
接下来,就功能而言,类是模块的SUPER集,因为它可以包含静态和非静态方法&amp;变量,以及虚拟和受保护的访问修饰符。
答案 3 :(得分:3)
类和模块之间的主要区别在于类可以实例化为对象,而标准模块则不能。因为标准模块的数据只有一个副本,当程序的一部分更改标准模块中的公共变量时,如果程序的任何其他部分随后读取该变量,则它将获得相同的值。相反,对象数据分别存在于每个实例化对象。另一个区别是,与标准模块不同,类可以实现接口。
来源:http://msdn.microsoft.com/en-us/library/7825002w(en-US,VS.80).aspx
答案 4 :(得分:0)
实际上,您使用类来创建对象。例如,在以下.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