2013-04-08 73 views
2

Shared是VB.NET中的一种范围或数据类型?什么时候需要在VB.NET中的类,函数或子类之前使用Shared字?例如,你为什么会把SharedMain方法的前面,就像这样:关键字'共享'在VB.NET中是什么意思?

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

我总是避免在整个类之前使用'shared'关键字,而是将其声明为模块。[This question](http:// stackoverflow。com/questions/881570/classes-vs-modules-in-vb-net)如果你好奇的话,可以进一步深入其中。但我认为这是个人偏好。 – 2013-04-08 20:41:38

回答

1

Shared修改在VB.NET是一样的在C#中static修改。它既不是范围(因为它可以是PrivatePublic)也不是数据类型。按照MSDN

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

1

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

在C#中,您可以创建一个静态类,这意味着所有成员都是静态的。这在VB中不被支持(至少不是根据this documentation)。 VB中的模块与C#中静态类的用途非常相似。

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

2

共享主没有意义(如果你建立一个控制台应用程序)

下面是共享一个例子:在主

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调用共享方法,因此无法访问变量和方法,这些变量和方法仅在实例化该类时才存在。

+0

Dim WithoutSharedInstance as New WithShared()应该更改为Dim WithoutSharedInstance作为New WithoutShared()。 – dybzon 2017-09-18 07:50:06

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