2

VB.NET 中是Shared范围类型还是数据类型?什么时候需要Shared在 VB.NET 中的类、函数或子类之前使用这个词?例如,为什么要放在方法Shared前面Main,像这样:

Public Shared Sub Main()
    ' ...
End Sub
4

4 回答 4

2

VB.NET 中的修饰符与 C#中的修饰符Shared相同。static它既不是范围(因为它可以是Privateor Public)也不是数据类型。根据MSDN

指定一个或多个声明的编程元素与整个类或结构相关联,而不是与类或结构的特定实例相关联。

于 2013-04-08T19:22:22.220 回答
2

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。由于您通过类定义调用共享方法,因此您无法访问变量和方法,这些变量和方法仅在类被实例化时才存在。

于 2013-04-08T20:41:32.783 回答
1

对于函数和子类,意味着函数或子类属于类本身,而不是类的实例。例如,String.IsNullOrEmpty指的是共享方法,而myString.TrimEnd()指的是实例(非共享)方法。

在 C# 中,您可以将类设为静态,这意味着所有成员都是静态的。这在 VB 中不受支持(至少根据本文档不支持)。VB 中的模块的用途与 C# 中的静态类非常相似。

我唯一能想到的方法需要静态(共享)时是另一个静态成员引用它时。否则,它们对于某些场景非常有用,例如当特定方法或属性不需要保留或访问任何特定于实例的状态时,但它们通常不是必需的。

于 2013-04-08T19:51:28.307 回答
1

看这个的一个好方法是通过示例:

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()不会,因为它需要一个对象实例。它返回的值与对象有关。

于 2013-04-09T01:54:06.740 回答