C#的静态与VB.NET中的NotInheritable相同吗?

时间:2016-02-22 17:06:40

标签: c# vb.net

遍布整个地方需要包含实用程序方法的类。所以,我想把它变成一个静态类。

为什么静态正在转换为 NotInheritable

public static class MyClass 
{
    public static string MyProperty { get; set; } 

    public static void MyMethod()
    {

    }
}

Public NotInheritable Class Employee
   Private Sub New()
   End Sub
   Public Shared Property MyProperty() As String
      Get
          Return m_MyProperty
      End Get
      Set
          m_MyProperty = Value
      End Set
  End Property
  Private Shared m_MyProperty As String

  Public Shared Sub MyMethod()
  End Sub
 End Class

在我看来,这看起来更像是一个密封的类,不是吗?

3 个答案:

答案 0 :(得分:10)

  

为什么静态转换为NotInheritable?

没有直接转换。 static类为sealed的事实是使VB.NET中的等价类NonInheritable

的原因
  

在我看来,这看起来更像是一个密封的课程,不是吗?

是的,但不是"错误"因为静态类也是密封的。

VB.NET没有"静态类"的概念。它最接近的是模块,它不是精确等价于static,因为它不能,例如,在其中嵌套另一个模块,而你可以在另一个静态类中定义一个静态类在C#中。因此,如果不将static类翻译为Module,转换器可能会误操作。

由于C#中的静态类是无法实例化的密封类,因此与VB.NET中的等效类最接近的是具有所有NotInheritable方法和属性的Shared类,使用私有默认实例构造函数,因此无法实例化该类。

因此生成的VB类具有源类的所有特性,但提供这些特性的机制有所不同。

答案 1 :(得分:6)

我不确定您将static转换为NotInheritable的用途,但它们并不等同。

VB.NET中的

NotInheritable相当于C#中的sealed C#' s static在VB.NET中被称为Shared

值得注意的是,Shared不能应用于类,只能应用于类的成员。这在VB.NET specification

中列出

Class Declarations

ClassDeclaration ::=
   [ Attributes ] [ ClassModifier+ ] Class Identifier LineTerminator
   [ ClassBase ]
   [ TypeImplementsClause+ ]
   [ ClassMemberDeclaration+ ]
   End Class LineTerminator
ClassModifier ::= AccessModifier | Shadows | MustInherit | NotInheritable

(请注意Shared下)ClassModifier ::= 正如其他用户所提到的,Module与C#static类相比更胜一筹。

答案 2 :(得分:1)

OP(在评论中)询问使用'模块'的版本。 - 这是:

Public Module [MyClass]
    Public Property MyProperty() As String

    Public Sub MyMethod()
    End Sub
End Module

请注意,模块的成员可以通过限定来调用:

Dim s As String = [MyClass].MyProperty

或者没有资格(这就是我在评论中所说的' VB魔术') - 我不推荐这个 - 只是为了表示完整性:

Dim s As String = MyProperty

是的,这是一个较旧的功能,但它仍然是VB中最接近C#静态类的功能 - 没有共享类'在VB(尚)。