模块和类之间有什么区别?

时间:2013-01-27 15:41:10

标签: vb.net visual-studio

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

An empty class file

虽然模块被描述为

A file for storing groups of functions

这似乎意味着一个模块对一个类来说没那么有用,因为一个类可以存储一组函数等等。

是不是模块只是一组功能,或者模块是否比Visual Studio文档建议的更多?

5 个答案:

答案 0 :(得分:13)

是一种类型。您可以像使用任何其他类型(StringIntegerDateFileInfo ...)一样使用此类型来声明变量,参数,属性和函数返回类型。< / 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控制台中,应用程序rRectangle对象:

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