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

本文关键字:中的 NotInheritable 相同 NET VB 静态 是否 | 更新日期: 2023-09-27 18:35:39

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

为什么将静态转换为 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

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

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

为什么将静态转换为 NotInheritable?

它没有直接转换。staticsealed的事实使等效类在 VB.NET NonInheritable

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

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

VB.NET 没有"静态类"的概念。它最接近的是模块,它与static并不完全相同,因为它不能在其中嵌套另一个模块,而您可以在 C# 中的另一个静态类中定义一个静态类。因此,转换器可能只是在谨慎方面犯了错误,没有将static类转换为Module

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

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

我不确定你用什么static转换为NotInheritable,但它们并不等同。

VB.NET 中的NotInheritable等效于 C# 中的sealed
C# 的static在 VB.NET 中称为 Shared

值得注意的是,Shared不能应用于类,只能应用于类的成员。这在 VB.NET 规范中进行了概述

类声明:

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

(请注意,ClassModifier ::=下明显缺乏Shared

正如其他用户所提到的,Module 比 C# static类更好。

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 中还没有"共享类"。