静态和密封等级差异


150
  1. 静态类中是否有实现的类?手段:

    static class ABC : Anyclass
  2. 在密封类和静态类中都可以继承任何类吗?
    手段:

    static class ABC : AClass {}

    sealed class ABC : AClass {}

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


static与确实无关sealed
ken2k 2013年

1
但是@ ken2k,静态类默认情况下在C#中被密封。不是吗 静态类根本不参与继承。
RBT

Answers:


654

这可以帮助您:

+--------------+---+-------------------------+------------------+---------------------+
|  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          |
+--------------+---+-------------------------+------------------+---------------------+

1
太棒了 感谢@HosseinNarimaniRad的及时回复。早上我本身就对您表示反对,因为该信息无论如何都是正确的,但这只是一个格式问题。顺便说一句,您的答案从发布之日起就应该成为公认的答案,但是看来我们将不得不等待更多:)
RBT 18'Feb

以此为基础,可以想到其他类型的排序。就像一些root class可以继承和实例化但不能继承的东西一样。不确定为什么这样做会有用,但仍然
AustinWBryan

static class Foo : object { }是有效的,但本质上是static class Foo { }
themefield

39

简单来说

静态类

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

密封类

密封类不能用作基类。密封类主要用于防止派生。因为它们永远不能用作基类,所以某些运行时优化可以使调用密封类成员的速度稍快一些。


19

您可以让一个sealed类从另一个类继承,但不能一个sealed类继承:

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

一个static类不能从其他类继承。


3

您可以将两者简单区分为:

       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

3

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

我试图向您展示以下代码中的密封类是派生类

 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();

    }
}

1

密封类:

  1. 可以创建实例,但不能继承
  2. 可以包含静态成员和非静态成员。

静态类:

  1. 既不能创建其实例,也不能继承它们
  2. 只能有静态成员。

0

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

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


4
也许您可以对此添加一些解释。
Abdul
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.