在VB.NET中标记类静态

Mag*_*Kat 82 c# vb.net

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

Joe*_*orn 116

模块==静态类

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

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

  • 你是VBer吗?模块就像命名空间.所有VB函数都是从VB的模块导入的,它们在一般范围内可用.对于我的观点,vb中的静态类不是模块,它具有不同的行为.如果你想要vb中的'静态类'行为,你应该有NotInheritable并声明它的所有成员'Shared',就像你在C#的静态类中所做的一样,它们将表现相同.一个模块不. (21认同)
  • @JoelCoehoorn模块和静态类最终得到相同的IL这一事实很有用,但VB另外*将*模块的成员提升为包含的命名空间.*promotion*方面是模块和静态类在实际使用和恕我直言中有所不同的地方,这是一个巨大的差异.我更喜欢*NotInheritable - 空私有构造函数 - 所有成员共享*解决方案,因为成员只能通过类到达,如果你试图获得静态类等价,这是更正确的行为.IL可能会有所不同,但这确实是学术性的. (16认同)
  • 我撤回了之前的评论.我正在看反射器中的模块,IL将其显示为密封. (2认同)
  • @Shimmy我不知道我之前是怎么错过这个评论的,但你错了.查看生成的IL,模块获得与静态类完全相同的处理.VB只为旧标准函数做了额外的工作,使它们出现在全局范围内. (2认同)
  • @JoelCoehoorn模块≈≈静态类,因为模块必须直接在命名空间中声明.这意味着无法在模块或类中声明模块. (2认同)
  • "Module"与静态`Class`不同的另一种方式是不允许通用的`Module`声明.不幸的是,该语言没有办法强制执行真正的静态类,但很明显,实际的等价物将如[其他答案]中所述(http://stackoverflow.com/a/18922541/3538012) (2认同)

小智 46

差不多了.你也必须防止实例化.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
Run Code Online (Sandbox Code Playgroud)
  • 共享就像静态类的方法.
  • NotInheritable就像是密封的.
  • Private New就像静态类无法实例化.

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

  • 为什么这不是公认的答案?感谢代码截图 (2认同)

Cha*_*ham 6

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

静态的VB.Net等价物是共享的.