指定一个或多个声明的编程元素与大型类或结构相关联,而不是与类或结构的特定实例相关联。
何时使用共享
共享类或结构的成员可使其可用于每个实例,而不是 非共享实例,其中每个实例保留其自己的副本。 例如,如果变量的值适用于整个应用程序,则共享非常有用。 如果声明该变量, Shared
则所有实例都将访问相同的存储位置,如果一个实例更改变量的值,则所有实例都将访问更新的值。
共享不会更改成员的访问级别。 例如,类成员可以共享和私有(只能从该类内部访问),也可以是非共享成员和公共成员。 有关详细信息,请参阅 Visual Basic 中的 Access 级别。
规则
声明上下文。 只能在模块级别使用
Shared
。 这意味着元素的Shared
声明上下文必须是类或结构,不能是源文件、命名空间或过程。组合修饰符。 不能在同一声明中与 Overrides、Overridable、NotOverridable、MustOverride 或 Static 一起指定
Shared
。访问。 可以通过使用其类或结构名称限定共享元素,而不使用其类或结构的特定实例的变量名称来访问共享元素。 你甚至不必创建类或结构的实例来访问其共享成员。
If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
隐式共享。 不能在 Const 语句中使用
Shared
修饰符,但常量是隐式共享的。 同样,不能声明模块或接口Shared
的成员,但它们是隐式共享的。
行为
存储。 共享变量或事件仅存储在内存中一次,无论创建其类或结构多少个实例。 同样,共享过程或属性只保留一组局部变量。
通过实例变量进行访问。 可以通过使用包含其类或结构的特定实例的变量的名称来访问共享元素。 尽管这通常按预期工作,但编译器会生成警告消息,并通过类或结构名称而不是变量进行访问。
通过实例表达式进行访问。 如果通过返回其类或结构的实例的表达式访问共享元素,编译器会通过类或结构名称进行访问,而不是计算表达式。 如果打算表达式执行其他作并返回实例,则此访问将产生意外结果。 以下示例演示了这种情况。
Sub Main() ' The following line is the preferred way to access Total. ShareTotal.Total = 10 ' The following line generates a compiler warning message and ' accesses total through class ShareTotal instead of through ' the variable instanceVar. This works as expected and adds ' 100 to Total. Dim instanceVar As New ShareTotal instanceVar.Total += 100 ' The following line generates a compiler warning message and ' accesses total through class ShareTotal instead of calling ' ReturnClass(). This adds 1000 to total but does not work as ' expected, because the WriteLine in ReturnClass() does not run. Console.WriteLine("Value of total is " & CStr(ShareTotal.Total)) ReturnClass().Total += 1000 End Sub Public Function ReturnClass() As ShareTotal Console.WriteLine("Function ReturnClass() called") Return New ShareTotal End Function Public Class ShareTotal Public Shared Property Total As Integer End Class
在前面的示例中,编译器在代码通过实例访问共享属性
Total
时生成警告消息。 在每种情况下,它都直接通过类ShareTotal
进行访问,并且不使用任何实例。 对于对过程ReturnClass
的预期调用,这意味着它甚至不会生成调用ReturnClass
,因此不执行显示“Function ReturnClass()调用”的其他作。
修饰 Shared
符可用于以下上下文: