2013-04-08 70 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()不會因爲它需要一個對象實例。它返回的值與對象有關。