在VB.NET中将类标记为静态


85

正如最近刚提及的问题答案,你不能从一个静态的类继承。如何执行VB.NET中与静态类一起的规则?由于该框架在C#和VB之间是兼容的,因此将有一种方法可以将类标记为静态是有意义的,但是似乎没有办法。

Answers:


120

模块==静态类

如果您只想要一个不能继承的类,请使用一个NotInheritable类;但不会是静态/共享的。您可以将所有方法,属性和成员都标记为Shared,但这与C#中的静态类并不完全相同,因为它不是由编译器强制执行的。

如果您确实希望VB.Net等效于C#静态类,请使用Module。它不能被继承,并且所有成员,属性和方法都是静态/共享的。


2
我撤回以前的评论。我正在看反射器中的模块,IL表示它是密封的。
MagicKat

27
您是VBer吗?模块就像一个命名空间。所有VB功能都是从VB的模块导入的,它们在一般范围内可用。我认为vb中的静态类不是模块,它具有不同的行为。如果要在vb中使用“静态类”的行为,则应具有NotInheritable并将其所有成员声明为“ Shared”,就像在C#的静态类中必须要做的那样,它们将表现相同。一个模块不是。
Shimmy Weitzhandler'2

2
@Shimmy我不知道我以前怎么错过这个评论,但是你错了。查看生成的IL,模块将获得与静态类完全相同的处理。VB只是为旧的标准功能做额外的工作,以使它们出现在全局范围内。
Joel Coehoorn 2013年

2
@JoelCoehoorn Module≈静态类,因为必须直接在名称空间中声明Module。这意味着不能在模块或类中声明模块。
LosManos

20
@JoelCoehoorn的模块和静态类结束与相同IL是很好的了解,但VB另外的事实促进了一个模块的成员含的命名空间。在推广方面,其中模块和静态类在实际使用中恕我直言,这是一个巨大的差异有所不同。我更喜欢NotInheritable-空的私有构造函数-所有成员共享的解决方案,因为只能通过类来访问成员,如果您试图获得静态类的对等,则这是更正确的行为。IL可能有所不同,但这确实是学术上的。
misha256 2014年

51

快好了。您还必须防止实例化。

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • 共享就像静态类的方法。
  • NotInheritable就像密封的。
  • Private New就像无法实例化的静态类。

请参阅:
MSDN-静态类和静态类成员


2
为什么这不是公认的答案?感谢您的代码
片段

6

如果只想创建一个无法继承的类,则可以在C#中使用Sealed,在VB.Net中使用NotInheritable。

等效于VB.Net的static是共享的。


您将其变量和功能标记为共享,就像在C#静态类中所做的一样。标记为NotInheritable使其密封。
Shimmy Weitzhandler,2010年

5

您可以在vb.net中创建静态类。解决方法是

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

AGE变量是公共静态的,您可以像这样在其他代码中使用它

 Dim myage As Integer = DB.AGE

朋友=公共,NotInheritable =静态


3
朋友!=公共,朋友=内部
Altair

1
NotInheritable!=静态,NotInheritable ==密封
Magnus

myage!= 20(可悲的是)
Grim

2

从CLR的角度来看,C#静态类只是“密封”和“抽象”类。您不能创建一个实例,因为它是抽象的,并且由于它是密封的,因此您不能从该实例继承。剩下的只是一些编译器魔术。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.