在.NET中的一切都是一个对象?

请帮助我们解决“几乎”的争议一切都是一个对象 ( 对堆栈溢出问题的答案作为一个新手,有什么我应该提防之前学习C#? )。 我认为这是事实,因为Visual Studio中的所有东西至less显示为一个结构。 请张贴参考,以便它不会成为“现代驴”( 这个美国人生活 )。

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

以下是对“一切都是对象”的评论:

  • 呃不,不是的 – 二元期权
  • 我想要一个例子… – scotty2012
  • 不是从基础types对象派生的所有东西吗? – 刺
  • 大多数东西都是对象… – Omar Kooheji
  • 值types,整数,双精度,对象引用(不是它们自己的对象)等都不是对象。 他们可以“装箱”看起来像对象(例如iToString()),但他们真的是原始types。 将条目更改为“近似everthing是一个对象”,我将删除downvote – Binary Worrier
  • 我赞赏澄清。 我认为在C#中可以与int进行交互的最低级别是作为一个结构,而不是一个对象? – http://msdn.microsoft.com/en-us/library/ms173109.aspx – rizzle
  • Int32是否inheritance自inheritance自Object的ValueType? 如果是这样,尽pipe行为,int是一个对象。 – Chris Farmer
  • 不,int的盒装types从inheritance自Object的ValueTypeinheritance。 它们不是传统意义上的对象,因为a)int不是对int的引用,而是int。 b)整数不是垃圾收集。 如果你声明一个Int32,那么这个int在堆栈上是4个字节,故事结束 – Binary Worrier

定义对象:作为类System.Object的inheritance者的“对象”与作为types的实例的“对象”相比作为引用types的“对象”。

这里的问题是,这实际上是两个问题 – 一个问题是关于inheritance,在这种情况下答案是“几乎所有”,另一个是关于引用types与值types/内存/装箱,这种情况下答案是“不” ”。

遗产:

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

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

从System.Object的MSDN条目 :

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

语言通常不需要类来从Object声明inheritance,因为inheritance是隐式的。

因为.NET Framework中的所有类都是从Object派生的,所以在Object类中定义的每个方法都可用于系统中的所有对象。 派生类可以并重写其中的一些方法。

所以不是C#中的每一个types都是从System.Object派生的。 即使对于那些types,仍然需要注意引用types和值types之间的区别,因为它们的处理方式非常不同。

拳击:

虽然值typesinheritanceSystem.Object ,但是它们在内存中与引用types的处理方式不同,它们在代码中如何通过方法传递的语义也是不同的。 事实上,一个值types不被视为一个对象(一个引用types),直到你明确地指示你的应用程序把它作为引用types装箱。 在C#中查看更多关于拳击的信息 。

晚会有点迟,但是我在search结果中看到了这一点,并且认为下面的链接会帮助后代:

埃里克·利珀特(Eric Lippert) 对此进行了非常彻底的讨论 ,提出了一个更好的(合格)

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

它的要点是,如果你讨厌从编写程序语言的人那里得到很好的解释,就是(指针),诸如Interface或generics参数types声明(“T”)不是对象,而是保证是在运行时可以作为对象处理,因为它们有一个确定的实例,那将是一个对象。 其他types(types,枚举,委托,类等)都是对象。 包括价值types,可以被装箱的对象作为其他答案进行了讨论。

这里有些人对于面向对象编程中的“对象”有一个奇怪的概念。 为了成为一个对象,它不一定是一个引用types,或者更一般地说,遵循任何正式的实现。

所有这一切意味着你可以在面向对象的世界中作为一stream的公民来运作。 既然你可以在C#中完成这个操作(感谢自动装箱),所有的东西都是一个对象。 在某种程度上,这对于函数来说甚至是正确的(但可以certificate不是用于类)。

这在实践中是否相关是另一个问题,但是这是OOP的一个普遍问题,我再次注意到。 没有人知道面向对象的定义(是的,大多数人都认为它与多态性,inheritance和封装有关,有些则为了好的措施而引入“抽象”)。

从使用的angular度来看,C#中的每个值都像对象一样处理。 这就是说,我喜欢目前接受的答案。 它提供了技术上重要的两个方面。

请注意,在其他情况下(例如C ++),其他方面都是强调的,因为C ++不一定是面向对象的,而且更关注于低级方面。 因此,对象POD和内build原语之间的区别有时是有意义的(然后再次,有时不)。

它们都被视为物体,但它们不是全部物体。 Autoboxing带来了困惑。

请参阅http://en.wikipedia.org/wiki/Object_type

抽象混淆了人们显然。

我认为值types不是对象。 它们在CLR中的存储方式不同 – 值types存储在堆栈中,对象存储在堆中。 您可以将值types转换为引用types,以使其像对象一样工作,但CLR将该值从堆栈中取出,并将其包装在一个对象中,并将其存储在堆中。 这是当你“变”variables时发生的情况。

你将一个对象与一个值或引用混淆在一起。 基本上,一切都是一个对象。 一个Int是一个对象,但它也是一个值types。 类实例是一个对象,但它也是一个引用types。

方法不是对象,也不是属性。 只是对物体进行操作。 是的,几乎一切都从对象类inheritance。

在C#中(和在一般的OOP),我们有types(类参考,结构值等)。 这些是定义。 而“对象”是一个给定types的具体实例。

所以,如果我们从字面上理解这个问题,是的,在实例化时,一切都是一个对象。

混淆很可能始于对一切基本类的名称的错误select。 在.NET中,这是Object类。

根据我阅读的所有书籍,C#中的所有内容都是一个对象。

有些是参考其他是值types。 值types对象inheritance自类ValueType 。 他们有不同的行为,但内在的…对象。

这就是为什么您可以将Int32存储在对象variables中以及您可以在.NET中创build的所有内容的原因。

有关更多详细信息,请参阅以下内容: http : //msdn.microsoft.com/zh-cn/library/s1ax56ch(VS.71).aspx

所有的值types都是从Object类隐式派生的。

来自: 值types(C#参考) – MSDN 3.5

所有的值types都是从System.ValueType中隐式地派生的。

来自: 值types类 – MSDN 3.5

ValueType用值types的更合适的实现覆盖Object中的虚拟方法。

来自: 枚举类 – MSDN 3.5

这个类inheritance自ValueType

inheritance层次如下:

  • System.Object的
    • System.ValueType
      • System.Enum

结论: 一切都是一个对象

取决于“一切”和“是一个客体”。 如果你定义这两个术语,答案很简单:-)

例如,在某些语言中, if-block是一个可以作为值传递的对象,分配给一个variables等等。 这不是在C#中的情况,所以显然不是一切都是C#中的对象。

尽pipe每个人似乎都将注意力集中在值types与参考types的辩论上,但是我们忘记了C#中的一个types既不是引用也不是值,它不是从对象派生的,也不能被转换为对象: 指针。

与值和引用types不同,指针不能被转换为对象。

根据C#指针types的MSDN文档 ,

指针types不从对象inheritance,指针types和对象之间不存在转换。 另外,装箱和拆箱不支持指针。 但是,您可以在不同的指针types之间以及指针types和整型之间进行转换。

数字2不是一个对象。

值types不是对象,它们服从不同的复制语义,不同的传递语义,并且必须被包装在一个类(Object)中以便被视为这样。

编辑:我认为这个论点有些模糊,因为你必须通过“对象”来定义你的意思。 对象只是从Objectinheritance的东西,还是服从于Object的使用语义? 或者我们正在谈论对象的最一般的定义,哪里可以包含对这些数据的数据和操作?

C#被称为统一types系统。 这意味着,一切都可以被看作是一个对象。 但是,在这之下有两种不同的types:值types和引用types。 值types可以通过装箱机制被看作是一个对象。 这意味着将创build一个对象来表示所讨论的值types的值。

考虑到这个问题是指OOP意义上的对象,答案是:

技术angular度来看,答案是:

教条的angular度来看,答案是: 是的

说明:

技术上的值types(原语或结构)不是对象,除非是“装箱”的forms,而是因为.Net通过装箱/拆箱(创build一个包含值的类实例和是从Object派生的),这意味着值types可以被视为对象和简单的值。

所以,价值types本质上是双重的,它们是价值对象 。 .Net中的值是需要时的对象,在其余情况下不是对象。

将技术方面考虑在内的正确答案是“.Net中的所有东西都像是一个对象”。

教条式的回答是“一切都是对象”。

这是对两个世界的讨论:语言和记忆。

对我来说,语言就像是一层抽象,而术语对象属于这个抽象层次。 在memeory组织方面,我没有看到关于对象的一个​​观点,如果你在谈论内存的时候使用“object”这个术语,你实际上是从另外一个抽象层借用这个术语的。 因此,你不应该忘记它来自哪里。

如果我们谈论C#,我不会明白为什么有人会用记忆组织作为论据。 当然,如果我将这个问题回答给某个人,我会说:“是的,在C#中,一切都是一个对象,但是你也应该知道,在这个引擎盖下,根据….可能会有不同的工作方式”

这可能会开始一个有趣的论点,但也可能会谈到一些:在类似的讨论中,可以说实际上没有面向对象的编程,只有程序编程。 你的CPU是否理解对象? 更好的是,实际上没有软件,只有不同的硬件状态:)

我的观点是有些术语不能转化为其他抽象层次,你应该把讨论放在它所属的地方(在这种情况下是语言而不是内存)。

即使这个问题的作者也说:“请注意,这个问题反应到C#不一定.NET和它如何处理数据下的数据(显然是1和0)。”

为了解决语义问题,当我们已经有一个完美的,明确的术语 – >“引用types”的时候,为什么要重载“object”这个单词,以便它意味着“引用types”,而在何时,通过重载单词“Object”这样我们就创build了这个线程演示的混淆……即,所有types(包括值types)都inheritance了types“System.Object”中定义的实现之间的不匹配。 显然,这至多是不必要的,最坏的情况是非常令人困惑。即使MS文档有时在这个问题上混淆的事实也无法传播混淆。

更简单和更清楚的是,定义和使用术语“对象”来表示任何types,值或引用的实例,以及短语“引用types”来描述使用指针variables的types,并将其状态存储在堆…