32

如上所述,在c#中从Object继承是否是多余的?下面的两组代码是否会导致定义等效对象?

class TestClassUno : Object
{
    // Stuff
}

对比

class TestClassDos
{
    // Stuff
}

我在 MSDN 上四处窥探,但无法找到任何完全确定的信息。

4

7 回答 7

33

如果未指定,每个class定义都将隐式继承自,System.Object因此这两个定义是等价的。

这两者唯一不同的是,如果有人Object在同一个命名空间中实际定义了另一种类型。在这种情况下,本地定义Object将优先并更改继承对象

namespace Example {
  class Object { } 
  class C : Object { } 
}

非常极端的案例,但如果我以前没有看过它就不会指出它

请注意,如果您使用object而不是Object. C# 关键字object是类型别名System.Object,因此它不会匹配Example.Object.

namespace Example2 { 
  class Object { } 
  class C : Object { } // Uses Example.Object
  class D : object { } // Uses System.Object
}

当然,如果您有一个真正邪恶的开发人员,您仍然可能会引起混淆object

namespace System { 
  class Object { 
    private Object() { } 
  }
}

namespace Example3 {
  // This will properly fail to compile since it can't bind to the private
  // Object constructor.  This demonstrates that we are using our definition
  // of Object instead of mscorlib's 
  class C : object { } // Uses our System.Object
}
于 2012-05-24T17:01:19.227 回答
20

是的,如果定义为 ,一切最终都继承自一个对象class。将显式继承排除在代码之外。

于 2012-05-24T16:58:23.870 回答
8

是的,从类中的对象继承是多余的

于 2012-05-24T17:00:35.760 回答
8

MSDN:对象类:支持 .NET Framework 类层次结构中的所有类,并为派生类提供低级服务。这是 .NET Framework 中所有类的终极基类;它是类型层次结构的根。

检查这项研究:从对象继承?调查如何。

在此处输入图像描述

于 2012-05-24T17:05:06.750 回答
6

Object 是 .Net 中所有类的母体。上面没有任何东西。

所有类都继承自它。所以这段代码

class TestClassDos
{
    // Stuff
}

自动意味着它是从对象继承的。

证明:您可以将任何实体类型转换为对象,如果它继承自它是可能的。

对象类摘要说

// Supports all classes in the .NET Framework class hierarchy and provides low-level
// services to derived classes. This is the ultimate base class of all classes
// in the .NET Framework; it is the root of the type hierarchy.
于 2012-05-24T17:00:02.713 回答
2

是的,它们都是一回事,我想我没有看到任何人提到结构,但是所有对象(即无论您声明一个类还是结构)它们最终都继承自Object,请参阅此Object MSDN 文章和此关于结构的其他文章

于 2012-05-24T17:22:37.533 回答
0

有时继承自是有意义的——当你有一个定义,并且你想锁定继承并防止其他部分声明扩展不同的类时。尝试从分部类中的另一种类型继承将给您CS0263 Compiler Errorobjectpartial class

这仅在您的部分类尚未从其他类型继承的情况下才有意义。

partial关键字不在您的代码示例中,但我认为它可能值得一提,因为在看到 API 中的类似设置后,我从 Google 找到了我的方式。除了像其他人指出object的那样从不指向官方的 s 继承之外,这样做没有任何好处,因为所有类都隐式地继承自。System.Objectobject

于 2020-10-19T21:13:02.867 回答