22

在 Visual Studio 中将新文件添加到 VB.Net 项目时,我可以选择“类”和“模块”。一个类被描述为

An empty class file

虽然一个模块被描述为

A file for storing groups of functions

这似乎意味着一个模块不如一个类有用,因为一个类可以存储函数组等等。

一个模块只是一组函数,还是模块比 Visual Studio 文档建议的更多?

4

5 回答 5

22

类是一种类型。您可以像使用任何其他类型 ( 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,因此它们通常用于存储全局数据和全局可用的方法。例如,您可以将人员列表存储在模块中。


但是你可以用类做更多的事情。您可以从基类派生类。这个新类继承了基类的所有内容,并且可以向其添加更多内容。例如,您可以EmployeePerson

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 中的对象和类,尤其是类和模块之间的差异部分。

于 2013-01-27T16:35:44.137 回答
13

模块只不过是静态类的另一个名称。
这里的所有都是它的。
如果您不相信,请使用 VB.NET 编译模块并使用 C-Sharp 使用 ILSpy 进行反编译。

是的,这意味着您是正确的,就功能而言,模块是类的子集。
因此,就功能而言,类是模块的超级集,因为它可以包含静态和非静态方法和变量,以及虚拟和受保护的访问修饰符。

于 2014-04-11T07:36:19.540 回答
10

类更像是一个单元,而模块本质上是函数、变量甚至类等内容的松散集合。

在公共模块中,项目中的类可以访问模块的函数和变量。您不必指定模块名称来寻址一个。您还可以在模块中包含类。

类的变量和函数在类的“所有权”之下。其他类使用的公共变量和函数(方法)与类名一起使用:classname.method与模块中的不同。

一个模块只有一个实例,但可以一次使用一个或多个类的实例。

于 2013-01-27T15:52:36.483 回答
4

类和模块之间的主要区别在于,类可以实例化为对象,而标准模块不能。因为标准模块的数据只有一份副本,所以当您的程序的一部分更改标准模块中的公共变量时,如果程序的任何其他部分随后读取该变量,则会获得相同的值。相反,对于每个实例化的对象,对象数据是分开存在的。另一个区别是,与标准模块不同,类可以实现接口。

来源: http: //msdn.microsoft.com/en-us/library/7825002w (en-US,VS.80).aspx

于 2013-01-27T15:54:08.087 回答
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
于 2014-11-17T17:02:57.500 回答