Visual Studio 模块和类有什么区别?

5lhxktic  于 2023-03-24  发布在  其他
关注(0)|答案(5)|浏览(292)

当在VisualStudio中向VB.Net项目添加新文件时,我可以选择“类”和“模块”。

An empty class file

虽然模块被描述为

A file for storing groups of functions

这似乎意味着模块不如类有用,因为类可以存储函数组和更多。
一个模块是一组简单的函数,还是模块中有比visual studio文档所建议的更多的东西?

w8f9ii69

w8f9ii691#

class是一种类型,可以像其他类型(StringIntegerDateFileInfo ...)一样使用该类型来声明变量、参数、属性和函数返回类型。

让我们举一个小例子:

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

modules是静态的。即存储在模块中的数据只存在一次。另一方面,您不必使用New示例化模块,因此它们通常用于存储全局数据和全局可用的方法。例如,您可以将人员列表存储在模块中。
但是,您可以使用类做更多的事情。您可以从基类派生类。这个新类继承基类的所有内容,并可以向其添加更多内容。例如,您可以从Person派生Employee

Public Class Employee
    Inherits Person

    Public Property Salary As Decimal

    Public Overrides Sub Print
        Console.WriteLine($"{FirstName} {LastName}, Salary = {Salary}")
    End Sub
End Class

Person.Print中的Overridable关键字允许派生类重新定义(覆盖)Print方法。(类中的函数和子函数称为方法。)
Employees与Persons的赋值兼容。您可以将一个Employee添加到persons列表中。这不需要在For Each循环中进行任何更改,即调用person.Print()会自动调用正确的Print方法(第一个方法用于“正常”人员,第二个方法用于Employees)。

Dim emp as Employee

emp = New Employee()
emp.FirstName = "Frank"
emp.LastName = "Taggart"
emp.Salary = 3500.00D

persons.Add(emp)

关于类还有很多要说的,我希望你对你能用类做什么有一定的了解。
参见Objects and classes in Visual Basic,特别是类和模块之间的差异一节。

zour9fqk

zour9fqk2#

模块只不过是静态类的另一个名称。
这就是它的全部。
如果你不相信,用VB .NET编译一个模块,然后用ILSpy用C-Sharp反编译。
是的,这意味着你是正确的,就功能而言,模块是类的子集。
因此,在功能方面,类是模块的SUPERset,因为它可以包含静态和非静态方法和变量,以及虚拟和受保护的访问修饰符。

5sxhfpxr

5sxhfpxr3#

类更像是一个单元,而模块本质上是函数、变量甚至类之类的松散集合。
在公共模块中,项目中的类可以访问模块的函数和变量。您不必指定模块名称来寻址。您也可以在模块中拥有类。
一个类的变量和函数由这个类更严格地“所有”。其他类使用的公共变量和函数(方法)与类名一起使用:classname.method,与模块中的不同。
一个模块只有一个示例,但是一个类可以一次使用一个或多个示例。

2q5ifsrm

2q5ifsrm4#

类和模块之间的主要区别是类可以示例化为对象,而标准模块不能。因为标准模块的数据只有一个副本,所以当程序的一部分更改标准模块中的公共变量时,程序的任何其他部分如果读取该变量,则会获得相同的值。相比之下,对象数据对于每个示例化的对象单独存在。另一个区别是,与标准模块不同,类可以实现接口。
来源:http://msdn.microsoft.com/en-us/library/7825002w(en-US,VS.80).aspx

doinxwow

doinxwow5#

实际上,你使用类来创建对象。例如在下面的.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

相关问题