【问题标题】:Marking A Class Static in VB.NET在 VB.NET 中将类标记为静态
【发布时间】:2010-09-13 05:53:17
【问题描述】:

正如最近的questionanswer 中所述,您不能从静态类继承。如何执行与 VB.NET 中的静态类相关的规则?由于该框架在 C# 和 VB 之间兼容,因此有办法将类标记为静态是有道理的,但似乎没有办法。

【问题讨论】:

    标签: c# vb.net


    【解决方案1】:

    模块 == 静态类

    如果你只想要一个不能继承的类,使用NotInheritable 类;但它不会是静态/共享的。您可以将所有方法、属性和成员标记为 Shared,但这与 C# 中的静态类并不完全相同,因为它不是由编译器强制执行的。

    如果您确实希望 VB.Net 等效于 C# 静态类,请使用 Module。它不能被继承,所有成员、属性和方法都是静态/共享的。

    【讨论】:

    • 我收回我之前的评论。我正在查看反射器中的一个模块,IL 显示它是密封的。
    • 你是一名VBer吗?模块就像命名空间。所有的 VB 函数都是从 VB 的模块中导入的,它们在通用范围内可用。在我看来,vb 中的静态类不是模块,它具有不同的行为。如果你想要 vb 中的“静态类”行为,你应该有 NotInheritable 并声明它的所有成员“共享”,就像你在 C# 的静态类中必须做的那样,它们的行为是一样的。一个模块不是。
    • @Shimmy 我不知道我之前怎么错过了这条评论,但你错了。查看生成的 IL,模块得到与静态类完全相同的处理。 VB 只是为旧的标准函数做了额外的工作,使它们出现在全局范围内。
    • @JoelCoehoorn Module ≈≈ 静态类,因为 Module 必须直接在命名空间中声明。这意味着不能在模块或类中声明模块。
    • @JoelCoehoorn 模块和静态类最终使用相同的 IL 的事实很高兴知道,但 VB 还会将模块的成员提升到包含名称空间。 promotion 方面是模块和静态类在实际使用中的不同之处,恕我直言,这是一个巨大的差异。我更喜欢 NotInheritable - 空私有构造函数 - 所有成员共享​​> 解决方案,因为只能通过类访问成员,如果您试图获得静态类等价,这是更正确的行为。 IL 可能会有所不同,但这确实是学术性的。
    【解决方案2】:

    差不多了。你也必须防止实例化。

    NotInheritable Class MyStaticClass
    
        ''' <summary>
        ''' Prevent instantiation.
        ''' </summary>
        Private Sub New()
    
        End Sub
    
        Public Shared Function MyMethod() As String
    
        End Function
    
    End Class
    
    • Shared 类似于静态类的方法。
    • NotInheritable 就像密封一样。
    • Private New 就像静态类无法实例化。

    见:
    MSDN - Static Classes and Static Class Members

    【讨论】:

    • 为什么这不是公认的答案?感谢您的代码片段
    【解决方案3】:

    您可以在 vb.net 中创建静态类。解决办法是

    Friend NotInheritable Class DB
        Public Shared AGE As Integer = 20
    End Class
    

    AGE变量是public static,你可以像这样在其他代码中使用它

     Dim myage As Integer = DB.AGE
    

    朋友 = 公开,NotInheritable = 静态

    【讨论】:

    • 朋友!=公开,朋友=内部
    • NotInheritable != 静态,NotInheritable == 密封
    • myage != 20(悲哀地)
    【解决方案4】:

    如果你只想创建一个不能继承的类,在 C# 中可以使用 Sealed,在 VB.Net 中使用 NotInheritable。

    静态的 VB.Net 等效项是共享的。

    【讨论】:

    • 您将其变量和功能标记为共享,就像您在 C# 静态类中必须做的那样。标记为 NotInheritable 使其密封。
    【解决方案5】:

    从 CLR 的角度来看,C# 静态类只是“密封”和“抽象”类。你不能创建一个实例,因为它是抽象的,你不能从它继承,因为它是密封的。剩下的只是一些编译器魔法。

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多