静态和密封类差异

Posted

技术标签:

【中文标题】静态和密封类差异【英文标题】:Static and Sealed class differences 【发布时间】:2013-04-19 11:58:24 【问题描述】:

    有没有在静态类中实现的类?意思是:

    static class ABC : Anyclass
    

    密封类和静态类都有可以继承的类吗? 意思是:

    static class ABC : AClass 
    

    sealed class ABC : AClass 
    

我可能在某种程度上错了吗?

【问题讨论】:

staticsealed 真的没有任何关系 但是@ken2k,静态类在 C# 中默认是密封的。不是吗?静态类根本不参与继承。 相关帖子 - Why can't I inherit static classes? 【参考方案1】:

这可能会对您有所帮助:

+--------------+---+-------------------------+------------------+---------------------+
|  Class Type  |   | Can inherit from others | Can be inherited | Can be instantiated | 
|--------------|---|-------------------------+------------------+---------------------+
| normal       | : |          YES            |        YES       |         YES         |
| abstract     | : |          YES            |        YES       |         NO          |
| sealed       | : |          YES            |        NO        |         YES         |
| static       | : |          NO             |        NO        |         NO          |
+--------------+---+-------------------------+------------------+---------------------+

【讨论】:

太棒了。感谢@HosseinNarimaniRad 的及时回复。我早上就给你投票了,因为信息无论如何都是正确的,但这只是一个格式问题。顺便说一句,你的答案应该是从发布的那一刻起就被接受的答案,但似乎我们将不得不等待更多:) 在此基础上考虑其他类型很有趣。像一些root class 可以被继承和实例化,但不能继承。不知道为什么会有用,但仍然 static class Foo : object 有效,但本质上是static class Foo 【参考方案2】:

简单来说

静态类

一个类可以声明为静态的,表示它只包含 静态成员。无法创建静态实例 类使用 new 关键字。静态类会自动加载 由 .NET Framework 公共语言运行时 (CLR) 当程序 或包含该类的命名空间已加载。

密封类

密封类不能用作基类。密封类是 主要用于防止衍生。因为它们永远无法使用 作为基类,一些运行时优化可以使调用密封 班级成员稍微快一点。

【讨论】:

【参考方案3】:

你可以让一个sealed类继承自另一个类,但你不能一个sealed类继承:

sealed class MySealedClass : BaseClass // is ok
class MyOtherClass : MySealedClass     // won't compile

static 类不能从其他类继承。

【讨论】:

【参考方案4】:

您可以简单地将它们区分为:

       Sealed Class       |        Static Class
--------------------------|-------------------------
it can inherit From other | it cannot inherit From other
classes but cannot be     | classes as well as cannot be
inherited                 | inherited

【讨论】:

【参考方案5】:

简单的回答是密封类不能用作基类

我试图告诉你密封类是下面代码中的派生类

 public sealed class SealedClass : ClassBase

    public override void Print()
    
        base.Print();
    

另一个密封特性只能通过它的实例访问。(你不能从它继承)

 class Program

    static void Main(string[] args)
    
        SealedClass objSeald = new SealedClass();
        objSeald.Name = "Blah blah balh";
        objSeald.Print();

    

【讨论】:

【参考方案6】:

1 - 不,您不能实现静态类。

2 - 不,您不能从静态或密封类继承

【讨论】:

也许你可以添加一点解释。

以上是关于静态和密封类差异的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 通用类库中平台差异属性设置方法

等效静态和非静态方法的速度差异很大

谷歌静态地图尺寸差异

通过对象访问时,静态最终字段和在声明时初始化的实例最终字段之间的差异[重复]

动态库静态库差异对比

在静态构造函数中或外部声明静态字段之间的差异