C#为什么在创建新类时不需要继承对象类

本文关键字:继承 对象 不需要 新类时 为什么 创建 | 更新日期: 2023-09-27 18:29:58

我问自己这个问题已经很久了。想发布一下。.Net中的每个类都是从对象类继承的,所以为什么我们在创建新类时不需要继承对象类呢。在这种情况下,框架默认会做什么吗?

class Test
        {
            public override string ToString()
            {
                return base.ToString();
            }
        }

class MyClass : Object
        {
            public override string ToString()
            {
                return base.ToString();
            }
        }

上面两个类声明有什么不同吗?

C#为什么在创建新类时不需要继承对象类

默认情况下,每个class都继承object。您不必指定,因为编译器将在编译期间为您执行此操作。

示例取自规范:

class A {}

class B: A {}

(…)

由于A没有显式指定直接基类,因此其直接基类是隐式object

你们的声明没有区别。

对象类类型是所有其他类型的最终基类C#中的每个类型都直接或间接地派生自对象类类型

C#5规范

这意味着,如果您的类C1已经继承了另一个类C2,则编译器不会添加object继承,因为它将通过C2类继承而可用在继承树的顶部总是有一个System.Object

来自MSDN

因为.NET Framework中的所有类都是从Object派生的,Object类中定义的每个方法在所有对象中都可用在系统中。

所以,你不需要任何特别的事情。他们是一样的。

您只需检查IL代码,编译器就会忽略对象。

    private class MyClass
    {
        public MyClass()
        {
            ldarg.0
            call     System.Object..ctor()
            ret
        }
        public override string ToString()
        {
            locals:
                V_0: string 
            ldarg.0
            call     string System.Object.ToString()
            stloc.0
            ldloc.0
            ret
        }
    } // class MyClass
    private class Test
    {
        public Test()
        {
            ldarg.0
            call     System.Object..ctor()
            ret
        }
        public override string ToString()
        {
            locals:
                V_0: string 
            ldarg.0
            call     string System.Object.ToString()
            stloc.0
            ldloc.0
            ret
        }
    } // class Test