【问题标题】:Is C#'s static the same as NotInheritable in VB.NET?C# 的静态与 VB.NET 中的 NotInheritable 相同吗?
【发布时间】:2016-02-22 17:06:40
【问题描述】:

到处都需要一个包含实用方法的类。所以,我想让它成为一个静态类。

为什么 static 被转换为 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


【解决方案1】:

为什么将静态转换为 NotInheritable?

它没有得到 直接 转换。 static 类是 sealed 的事实是 VB.NET 中的等效类 NonInheritable

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

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

VB.NET 没有“静态类”的概念。它最接近的是模块,它不是 staticexact 等价物,因为它不能在其中嵌套另一个模块,而您可以在 C# 中的另一个静态类中定义一个静态类.因此,转换器可能会因未将 static 类转换为 Module 而谨慎行事。

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

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

【讨论】:

  • 你说得对,VB中最接近的等价物是“模块”,但为什么说它不能用纯代码转换来表示呢?
  • @DaveDoknjas:有道理。为了保险起见,SharedModule 之间的争议呢?例如,我不应该写任何一个来表明我的真实意图吗?我想要一个静态类,而不是密封类本身,即使静态意味着密封?
  • @Richard77:我没有“理解”争议——“模块”与 C# 静态类最接近。
  • @DaveDoknjas:我读过几个地方说 Module 是一种旧的做事方式。上面的代码可以用Module关键字代替继承吗?
  • @DaveDoknjas 我得再看看,但我相信 VB 中的 Module 和 C# 中的 static class 之间存在一些差异,这使得它们不完全等同。想到的一个问题是,您不能在 VB 中“嵌套”模块,但您可以在 C# 的静态类中定义一个类(静态或非静态)。
【解决方案2】:

我不确定您使用什么将 static 转换为 NotInheritable,但它们并不等效。

VB.NET 中的NotInheritable 相当于 C# 中的sealed
C# 的 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

(注意ClassModifier ::=下明显缺少Shared

正如其他用户所提到的,Module 更好地等效于 C# static 类。

【讨论】:

  • 令人困惑的是,在一些在线文章中,据说shared 是由编译器强制执行的——不管这意味着什么。其他一些文章说静态的等价物应该是Module。然而,其他人批评Module,因为它应该是 VBScript 遗物。我迷路了。
  • 那个telerik转换工具看起来不对。尝试转换 C# -> VB,取结果并转换回 c#
  • @alex.b 如果转换器错误,应该输出什么?不使用 static 关键字,生成的 C# 类具有相同的特性(密封、无实例方法、无公共构造函数)。
  • @DStanley:输出“应该”是“模块”——这与 C# 静态类相同(添加了一些 VB 魔法,允许在没有资格的情况下调用成员——但这只是 VB 魔法,而不是“模块”本身的性质)。
【解决方案3】:

OP 要求(在 cmets 中)使用“模块”的版本 - 这里是:

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

【讨论】:

  • 所以VB.NET中没有共享类。并且 Module 的成员是隐式共享的。
  • @Richard77:正确(并且可以不使用模块名称来调用模块成员,但这是一种常见的不良做法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多