关键字“共享”在VB.NET中意味着什么?

时间:2013-04-08 19:16:39

标签: vb.net types shared

Shared是一种范围或VB.NET中的数据类型吗?什么时候需要在VB.NET中的类,函数或子类之前使用Shared字?例如,为什么要将Shared放在Main方法的前面,如下所示:

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

4 个答案:

答案 0 :(得分:2)

Shared Main没有意义(如果您构建控制台应用程序)

以下是共享的示例:

Class WithShared
  Shared Sub A_Method()
  End Sub
End Class

Class WithoutShared
  Sub A_Method()
  End Sub
End Class

现在主要的代码:

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

答案 1 :(得分:1)

VB.NET中的Shared修饰符与C#中的static修饰符相同。它既不是范围(因为它可以是PrivatePublic)也不是数据类型。根据{{​​3}}:

  

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

答案 2 :(得分:1)

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

在C#中,您可以使类静态,这意味着所有成员都是静态的。 VB中不支持此功能(至少不符合this documentation)。 VB中的模块与C#中的静态类非常相似。

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

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