3

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

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


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

以上两个类声明有什么区别吗?

4

3 回答 3

13

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

取自规范的示例:

class A {}

class B: A {}

(...)

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

您的声明之间没有区别。

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

C# 5 规范

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

于 2013-09-02T14:20:40.470 回答
2

来自MSDN

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

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

于 2013-09-02T14:22:51.640 回答
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
于 2013-09-02T14:42:21.903 回答