VB.NET 中是Shared
范围类型还是数据类型?什么时候需要Shared
在 VB.NET 中的类、函数或子类之前使用这个词?例如,为什么要放在方法Shared
前面Main
,像这样:
Public Shared Sub Main()
' ...
End Sub
VB.NET 中的修饰符与 C#中的修饰符Shared
相同。static
它既不是范围(因为它可以是Private
or Public
)也不是数据类型。根据MSDN:
指定一个或多个声明的编程元素与整个类或结构相关联,而不是与类或结构的特定实例相关联。
Shared Main 没有意义(如果您构建控制台应用程序)
这是共享的示例:
Class WithShared
Shared Sub A_Method()
End Sub
End Class
Class WithoutShared
Sub A_Method()
End Sub
End Class
现在您的 Main 中可能的代码:
Dim WithSharedInstance as New WithShared()
WithSharedInstance.A_Method() 'does not work
WithShared.A_Method() 'works
Dim WithoutSharedInstance as New WithShared()
WithoutSharedInstance.A_Method() 'works
WithoutShared.A_Method() 'does not work
因此,如果调用不依赖于特定实例,则使用 Shared。由于您通过类定义调用共享方法,因此您无法访问变量和方法,这些变量和方法仅在类被实例化时才存在。
对于函数和子类,意味着函数或子类属于类本身,而不是类的实例。例如,String.IsNullOrEmpty
指的是共享方法,而myString.TrimEnd()
指的是实例(非共享)方法。
在 C# 中,您可以将类设为静态,这意味着所有成员都是静态的。这在 VB 中不受支持(至少根据本文档不支持)。VB 中的模块的用途与 C# 中的静态类非常相似。
我唯一能想到的方法需要静态(共享)时是另一个静态成员引用它时。否则,它们对于某些场景非常有用,例如当特定方法或属性不需要保留或访问任何特定于实例的状态时,但它们通常不是必需的。
看这个的一个好方法是通过示例:
Dim firstName as String = "Bob"
Dim lastName as String = "Jones"
Dim fullName as String = String.Format("{0} {1}", firstName, lastName.ToUpper())
如果您正在创建 String.ToUpper() 和 String.Format() 函数,则需要区分作用于类实例的函数和不作用于实例的函数。
如果你正在写一个像这样的类String
:
.Format()
将被声明为 Shared,因为它不需要对象。
.ToUpper()
不会,因为它需要一个对象实例。它返回的值与对象有关。