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
在我看来,这看起来更像是一个密封的类,不是吗?
为什么将静态转换为 NotInheritable?
它没有直接转换。static
类sealed
的事实使等效类在 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 中还没有"共享类"。