Shared
是一种范围或VB.NET中的数据类型吗?什么时候需要在VB.NET中的类,函数或子类之前使用Shared
字?例如,为什么要将Shared
放在Main
方法的前面,如下所示:
Public Shared Sub Main()
' ...
End Sub
答案 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
修饰符相同。它既不是范围(因为它可以是Private
或Public
)也不是数据类型。根据{{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()
不会,因为它需要一个对象实例。它返回的值与对象有关。