是Shared
是VB.NET中的一种范围或数据类型?什么时候需要在VB.NET中的类,函数或子类之前使用Shared
字?例如,你为什么会把Shared
在Main
方法的前面,就像这样:关键字'共享'在VB.NET中是什么意思?
Public Shared Sub Main()
' ...
End Sub
是Shared
是VB.NET中的一种范围或数据类型?什么时候需要在VB.NET中的类,函数或子类之前使用Shared
字?例如,你为什么会把Shared
在Main
方法的前面,就像这样:关键字'共享'在VB.NET中是什么意思?
Public Shared Sub Main()
' ...
End Sub
的Shared
修改在VB.NET是一样的在C#中static
修改。它既不是范围(因为它可以是Private
或Public
)也不是数据类型。按照MSDN:
指定一个或多个声明编程元素在逃类或结构相关,而不是与类或结构的具体实例。
对于函数和子类,它表示函数或子类属于类本身,而不属于该类的实例。例如,String.IsNullOrEmpty
引用共享方法,而myString.TrimEnd()
引用实例(非共享)方法。
在C#中,您可以创建一个静态类,这意味着所有成员都是静态的。这在VB中不被支持(至少不是根据this documentation)。 VB中的模块与C#中静态类的用途非常相似。
只有当方法需要为静态(共享)时,我才能想到的是当另一个静态成员引用它时。否则,它们对于某些场景非常有用,例如特定方法或属性不需要保留或访问任何特定于实例的状态,但通常不是必需的。
共享主没有意义(如果你建立一个控制台应用程序)
下面是共享一个例子:在主
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调用共享方法,因此无法访问变量和方法,这些变量和方法仅在实例化该类时才存在。
Dim WithoutSharedInstance as New WithShared()应该更改为Dim WithoutSharedInstance作为New WithoutShared()。 – dybzon 2017-09-18 07:50:06
看看这一个好方法是通过例如:
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()
不会因为它需要一个对象实例。它返回的值与对象有关。
我总是避免在整个类之前使用'shared'关键字,而是将其声明为模块。[This question](http:// stackoverflow。com/questions/881570/classes-vs-modules-in-vb-net)如果你好奇的话,可以进一步深入其中。但我认为这是个人偏好。 – 2013-04-08 20:41:38