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

时间:2013-09-02 14:19:32

标签: c#

我一直在问自己这个问题很长一段时间了。想发布它。 .Net中的每个类都是从对象类继承的,所以为什么我们在创建新类时不需要继承对象类。在这种情况下,默认情况下框架是否有任何功能?

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


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

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

3 个答案:

答案 0 :(得分:12)

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

取自规范的例子:

  

class A {}

     

class B: A {}

     

(...)

     

由于A未明确指定直接基类,因此其直接基类隐式 object

您的声明之间没有区别。

  

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

C#5规范

IT意味着,如果您的类C1已经继承了另一个类C2,则编译器不会添加object继承,因为它已经可以通过C2类获得遗产。 在继承树的顶部,始终有System.Object类。

答案 1 :(得分:2)

来自MSDN;

  

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

所以,你没有任何特别的东西。他们是一样的。

答案 2 :(得分:1)

您只需检查编译器忽略对象的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