请帮助我们解决"几乎"的争议一切都是一个对象(Stack Overflow问题的答案作为一个新手,在学习C#之前有什么我应该注意的吗?).我认为就是这种情况,因为Visual Studio中的所有内容至少都显示为结构体.请张贴参考文献,以免它变成"现代傻瓜"(This American Life).
请注意,这个问题涉及C#,不一定是.NET,以及它如何处理引擎盖下的数据(显然它都是1和0).
以下是"一切都是对象"的评论:
呃,不,不是. - Binary Worrier
我想要一个例子...... - scotty2012
是不是从基类型Object派生的一切? - rizzle
大多数东西都是物品... - Omar Kooheji
值类型,整数,双精度,对象引用(不是它们自己的对象)等不是对象.它们可以"盒装"看起来像对象(egiToString())但实际上它们是原始类型.将条目更改为"NEVERLY everthing is a object",我将删除downvote - Binary Worrier
我很欣赏澄清.我认为你可以在C#中与int进行交互的最低级别是一个结构,它不是一个对象?- http://msdn.microsoft.com/en-us/library/ms173109.aspx - rizzle
Int32不继承自继承自Object的ValueType吗?如果是这样,尽管有这种行为,int也是一个对象. - 克里斯农夫
不,int的boxed类型继承自ValueType,它继承自Object.它们不是传统意义上的对象,因为a)int不是对int的引用,IT是int.b)int不是垃圾收集.如果你声明一个Int32,那么这个int是堆栈上的4个字节,故事结尾 - Binary Worrier
对象的定义:"对象"作为类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
.即使对于那些类型,您仍然需要注意引用类型和值类型之间的区别,因为它们的处理方式截然不同.
拳击:
当值类型都继承自System.Object
它们的处理方式不同内存的引用类型,以及他们是如何通过在代码的方法通过语义是不同的.实际上,值类型不会被视为Object(引用类型),直到您通过将其作为引用类型明确指示应用程序执行此操作.在这里查看有关C#拳击的更多信息.
派对有点晚了,但是我在SO的搜索结果中发现了这一点,并认为下面的链接可以帮助后代:
Eric Lippert 用一个更好(合格)的陈述非常彻底地讨论了这个问题:
纠正这个神话的方法是简单地将"derives from"替换为"is convertible to",并忽略指针类型:C#中的每个非指针类型都可以转换为object.
它的要点,如果你恨从写编程语言的人阅读以及图示的解释是,(指针除外),诸如此类接口,或泛型参数类型声明("T")不是对象,但保证是可以在运行时作为对象处理,因为它们有一个明确的实例,它将是一个Object.其他类型(类型,枚举,代理,类等)都是对象.包括值类型,可以像其他答案一样讨论对象.
这里的一些人对面向对象编程中的"对象"有一个奇怪的概念.为了让事情成为一个对象时,它并没有必须是引用类型,或者更一般地说,按照任何正式实施.
所有这一切都意味着您可以在面向对象的世界中作为一流公民进行操作.因为您可以在C#中的值上执行此操作(由于自动装箱),所以一切都确实是一个对象.在某种程度上,这对于函数来说甚至是正确的(但可以说不是类).
这在实践中是否相关是另一个问题,但这是OOP的一个普遍问题,我再次注意到了.没有人清楚OOP的定义(是的,大多数人都同意它与多态性,继承和封装有关,有些人提出"抽象"以获得良好的衡量标准).
从使用的角度来看,C#中的每个值都像对象一样处理.那就是说,我喜欢目前接受的答案.它提供了技术上重要的方面.
请注意,在其他上下文中,例如C++,其他方面都受到了强调,因为C++不一定是面向对象的,而且更侧重于低级方面.因此,对象,POD和内置基元之间的区别有时是有意义的(然后有时也是如此).
它们都被视为对象,但它们不是所有对象.Autoboxing引起了混乱.
有关更多信息,请参阅此处:http://en.wikipedia.org/wiki/Object_type
这种抽象显然让人困惑.
您将对象与值或引用混淆.基本上,一切都是一个对象.Int是一个对象,但它也是一个值类型.类实例是一个对象,但它也是一个引用类型.
方法不是对象,也不是属性.只是操作对象.是的,几乎所有东西都继承自对象类.
我认为值类型不是对象.它们在内存中以不同的方式存储在CLR中 - 值类型存储在堆栈中,对象存储在堆上.您可以将值类型转换为引用类型以使它们像对象一样工作,但CLR将值从堆栈中取出,将其包装在对象中,并将其存储在堆上.这就是当你"装箱"一个变量时会发生的事情.
在C#(以及一般的OOP中),我们有类型(类 - 引用,结构 - 值等).这些是定义.而"对象"是给定类型的具体实例.
所以,如果我们按字面意思读出问题,是的,实例化时一切都是对象.
混乱最可能始于为所有事情选择一个基类的名称.在.NET中,这是Object类.