.NET中的所有东西都是对象吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

请帮助我们解决“几乎”的争论一切都是一个对象。我认为是这样的,因为Visual Studio中的所有东西都至少显示为一个结构体。(This American Life)。

请注意,这个问题涉及C#,不一定是.NET,以及它如何处理数据引擎下的数据(显然它全是1和0)。

对象的定义:“对象”作为类System.Object的继承者,而“对象”作为类型的实例,而“对象”作为引用类型。“

提问于
用户回答回答于

这里的问题是,这实际上是两个问题 - 一个问题是关于继承,在这种情况下答案是“几乎所有”,另一个是关于引用类型与值类型/内存/装箱,这种情况下答案是“否”。

在C#中,以下是正确的:

  • 所有值类型(包括枚举和可空类型)都源自于System.Object
  • 所有类,数组和委托类型都来自于System.Object
  • 接口类型不是从派生的System.Object。它们都可以转换为System.Object,但接口只能从其他接口类型派生,而System.Object不是接口类型。
  • 没有指针类型派生自System.Object,也没有任何可直接转换为System.Object
  • “Open”类型的参数类型也不是从中派生而来的System.Object。类型参数类型不是从任何派生的; 类型参数受限于从有效基类派生,但它们本身并不是从任何东西“派生”的。

System.Object的MSDN条目中

支持.NET Framework类层次结构中的所有类,并为派生类提供低级服务。这是.NET Framework中所有类的最终基类; 它是类型层次结构的根。 语言通常不需要类来声明来自Object的继承,因为继承是隐式的。 由于.NET Framework中的所有类都是从Object派生的,因此Object类中定义的每个方法都可用于系统中的所有对象。派生类可以并重写其中的一些方法。

因此,并不是C#中的每个类型都来自于System.Object。即使对于那些类型,仍然需要注意引用类型值类型之间的区别,因为它们的处理方式非常不同。

Boxing:

当值类型都继承System.Object它们的处理方式不同内存的引用类型,以及他们是如何通过在代码的方法通过语义是不同的。事实上,一个值类型不被视为一个对象(一个引用类型),除非你明确地指示你的应用程序通过将其装箱为引用类型来完成此操作。点击这里查看更多关于在C#中进行装箱的信息

用户回答回答于

Eric Lippert 非常透彻地讨论了这一点,并提出了一个更好的(合格的)声明:

纠正这个神话的方法是简单地将“派生自”替换为“可转换为”,并忽略指针类型:C#中的每个非指针类型都可以转换为对象。

它的要点,如果你讨厌阅读编写程序语言的人所作的详尽解释,那就是(指针放在一边),诸如Interface或通用参数类型声明(“T”)的东西不是对象,而是保证是在运行时可以作为对象处理,因为它们有一个确定的实例,这将是一个对象。其他类型(类型,枚举,委托,类等)都是对象。包括值类型,可以将其装箱以反对其他答案进行讨论。

扫码关注云+社区