Visual Basic 中的共享成员

更新:2007 年 11 月

共享成员是由一个类或结构的所有实例共享的属性、过程和字段。一些编程语言将这样的项称为静态成员。

共享字段和属性

当信息是类的一部分而非特定于类的任何实例时,共享字段和属性很有用。当更改共享字段和属性的值时,您更改了与该类和该类的所有实例关联的值。

另一方面,更改与任何一个实例关联的非共享字段或属性的值,不会影响该类的其他实例中的该字段或属性的值。一个类的各个实例的非共享字段和非共享属性是相互独立的。

这样,共享字段和属性的行为就像全局变量一样,只可以从类的实例或限定的类名称进行访问。如果没有共享字段和属性,就需要使用模块级变量来获得同样的效果。然而模块级变量会使类难以理解和维护。另外,以这种方式使用模块级变量与类所表示的封装的概念冲突。

共享过程

共享过程是不与类的特定实例相关联的类方法。例如,在 Math 类内定义的 Cos 方法是共享方法。可以将共享过程作为对象的方法调用或直接从类调用。

共享过程和属性不具有对类的实例的访问权限。因此,在共享方法中只允许对非共享数据成员进行限定引用。

说明:

建议不要编写通过类的实例访问共享成员的代码。这是因为编译器会忽略对共享成员的限定,并认为是直接通过类访问了它。在某些情况下,您可能打算使用限定对象运行某些代码,这样 Visual Basic 编译器将会为通过类的实例访问共享成员生成一个警告。IntelliSense 不会显示类的实例的共享成员。

共享成员示例

下面的示例创建一个共享字段、两个实例字段和一个共享方法来演示共享成员在代码中如何工作:

Public Class Item
    Public Shared Count As Integer = 1
    Public Shared Sub ShareMethod()
        MsgBox("Current value of Count: " & Count)
    End Sub

    Public Sub New(ByVal Name As String)
        ' Use Count to initialize SerialNumber.
        Me.SerialNumber = Count
        Me.Name = Name
        ' Increment the shared variable
        Count += 1
    End Sub
    Public SerialNumber As Integer
    Public Name As String
    Public Sub InstanceMethod()
        MsgBox("Information in the first object: " & _
            Me.SerialNumber & vbTab & Me.Name)
    End Sub
End Class

Sub TestShared()
    ' Create two instances of the class.
    Dim part1 As New Item("keyboard")
    Dim part2 As New Item("monitor")

    part1.InstanceMethod()
    part2.InstanceMethod()
    Item.ShareMethod()
End Sub

当执行 TestShared 过程时,该类的两个实例被创建。构造函数使用共享字段 Count 初始化实例字段 SerialNumber,然后递增 Count。此技术自动为每个实例指定不同的序列号。

在创建两个实例之后,将在两个对象上都调用实例方法 InstanceMethod,并且还调用共享方法 ShareMethod。输出为:

Information in the first object: 1 keyboard

Information in the second object: 2 monitor

Current value of the shared Count field: 3

请参见

概念

结构和类

参考

Dim 语句 (Visual Basic)

Cos

其他资源

类的属性、字段和方法

结构:您自己的数据类型