【问题标题】:Why declare static classes as sealed and abstract in C#?为什么在 C# 中将静态类声明为密封和抽象?
【发布时间】:2010-11-19 03:10:21
【问题描述】:

This MSDN article 声明静态类应声明为密封和抽象。我的印象是静态类已经被密封了。为什么还需要将静态类声明为密封的?

【问题讨论】:

  • 这部分句子明确指代C#以外的其他语言
  • @HenkHolterman 和 VB.NET 也是如此,因为 MustInherit 和 NotInheritable 不能一起使用。

标签: c#


【解决方案1】:

我认为那篇文章的相关内容是:

“如果您的编程语言没有对静态类的内置支持,请务必将静态类声明为密封和抽象,并添加私有实例构造函数。”

请记住,.NET 框架支持许多不同的语言。

【讨论】:

    【解决方案2】:

    似乎是说,如果语言不支持静态类,则使用私有构造函数将类声明为密封和抽象类是静态类的替代方案。

    【讨论】:

      【解决方案3】:

      C# v1 不允许在类中使用“静态”关键字。因此,如果您有一个只有静态方法的类,建议将其声明为“密封”、“抽象”并将构造函数设为私有。这意味着没有人可以实例化您的类或尝试从它继承。 [从只有静态方法的类继承是没有意义的。]

      C# v2 允许在类上使用 static 关键字,因此您不必使用上述技巧来强制正确使用。

      【讨论】:

        【解决方案4】:
        • 将类标记为abstract 的一个影响是它不能被实例化。
        • 将类标记为sealed 的效果之一是它不能被继承。

        这就是static 类的真正含义——一个不能被实例化并且不能被继承的类。

        所以文章没有说明你应该将你的静态类标记为abstractsealed,但这是静态类在 IL 中的表示方式。

        (如果其他语言没有 static 关键字,则可能允许您这样做,尽管我对此表示怀疑,因为 abstract sealed 类在语义上没有多大意义。)

        【讨论】:

        • 想要为未来的旅行者添加,在 4.0 IL 中,使用静态,你会得到类似“.class private auto ansi seal”的东西。所以是的,他的回答是为什么。在带有静态的 C# 中,它删除了在 IL 中为您生成的任何默认构造函数,因为在 C# 中它不能被继承。因此,C# 中的 static 是“首选”,只需完成上述一些答案即可。
        猜你喜欢
        • 2014-01-24
        • 2014-12-27
        • 2011-04-04
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 2013-03-05
        • 2021-06-10
        • 1970-01-01
        相关资源
        最近更新 更多