【问题标题】:What, if any, difference is there between a C# static class and a VB.NET ModuleC# 静态类和 VB.NET 模块之间有什么区别(如果有的话)
【发布时间】:2021-02-19 19:37:38
【问题描述】:

C# 支持在类定义上使用static 修饰符来定义一个不能被继承、被密封并且只有静态成员的类。 VB.NET 支持Module 语句来定义通过其命名空间可用的引用类型,效果类似。

我知道 C# 和 VB.NET 共享一个共同的 CodeDOM、Roslyn 编译器和目标 IL。我的问题是静态类与模块之间有什么区别(如果有的话)。

【问题讨论】:

  • 您可以使用任何 IL 检查工具(如 ILSpy)轻松地为自己找出答案。 VB.NET Module 只不过是一个sealed 类,其中static 成员标记有StandardModule 属性。唯一值得注意的是,该类本身没有标记为static(IL 级别为abstract sealed),尽管这在实践中当然没有什么区别。

标签: c# .net vb.net roslyn codedom


【解决方案1】:

就我而言,只有两个真正的区别在于模块不能被继承,也没有构造函数。

除此之外,模块与不可继承类极为相似,其中该类仅包含共享(vb.net 相当于静态)成员。

例如以下模块:

Public Module Test

    Public Function Foo() As String
        Return "Foo"
    End Function

End Module

可以类似地表示为:

Public NotInheritable Class Test

    Public Shared Function Foo() As String
        Return "Foo"
    End Function

End Class

C# 开发人员可能更喜欢后者,而旧版 Visual Basic 开发人员则倾向于前者。

【讨论】:

  • 就我而言,只有两个真正的区别在于模块......也没有构造函数 - 我不确定我是否完全同意这是一个“与 C# 的区别” - 两种语言都有静态构造函数/方法的概念,这些构造函数/方法在静态上下文中自动运行以进行初始化;顺便说一句,您当然可以在您的Module Module1 中添加一个Sub New() Throw New Exception(),然后应用程序将在启动时崩溃
  • @CaiusJard - 那是因为应用程序的起点是 Module1 的 New 方法。应用程序的起点和构造函数不是一回事。
  • 嗯不,这是因为静态构造函数将在第一次引用时被调用。 Module1.New 是一个私有的、无参数的构造函数。
  • 我认为你可以防止类被实例化提供一个私有构造函数,否则默认构造函数可用。
  • 是的,我不应该说“在启动时”,因为它有点误导/过于简单化了;当您在 Module1 中有 Sub MainSub New 时,这是真的。我应该说“在first reference to anything in module1,这将是on startup if Main is in module1”。
猜你喜欢
  • 2023-04-07
  • 2019-09-13
  • 2016-10-21
  • 2013-07-21
  • 2013-01-11
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
相关资源
最近更新 更多