遍布整个地方需要包含实用程序方法的类。所以,我想把它变成一个静态类。
为什么静态正在转换为 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
在我看来,这看起来更像是一个密封的类,不是吗?
答案 0 :(得分:10)
为什么静态转换为NotInheritable?
没有直接转换。 static
类为sealed
的事实是使VB.NET中的等价类NonInheritable
在我看来,这看起来更像是一个密封的课程,不是吗?
是的,但不是"错误"因为静态类也是密封的。
VB.NET没有"静态类"的概念。它最接近的是模块,它不是精确等价于static
,因为它不能,例如,在其中嵌套另一个模块,而你可以在另一个静态类中定义一个静态类在C#中。因此,如果不将static
类翻译为Module
,转换器可能会误操作。
由于C#中的静态类是无法实例化的密封类,因此与VB.NET中的等效类最接近的是具有所有NotInheritable
方法和属性的Shared
类,使用私有默认实例构造函数,因此无法实例化该类。
因此生成的VB类具有源类的所有特性,但提供这些特性的机制有所不同。
答案 1 :(得分:6)
我不确定您将static
转换为NotInheritable
的用途,但它们并不等同。
NotInheritable
相当于C#中的sealed
C#' s static
在VB.NET中被称为Shared
。
值得注意的是,Shared
不能应用于类,只能应用于类的成员。这在VB.NET specification
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(尚)。