当前位置:  开发笔记 > 编程语言 > 正文

.NET中的所有内容都是对象吗?

如何解决《.NET中的所有内容都是对象吗?》经验,为你挑选了7个好方法。

请帮助我们解决"几乎"的争议一切都是一个对象(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的继承者与"对象"作为类型与"对象"作为引用类型的实例."



1> Daniel Schaf..:

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

遗产:

在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#拳击的更多信息.


从MSDN:"装箱和取消装箱使值类型被视为对象"(http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.80).aspx).因此,这意味着值类型ARENT对象,如果它们必须被装箱以便"被视为对象".
这个文档显然具有误导性,因为这是对OOP定义的错误解释,其中object只是一个类型的实例.doc的这一部分应该被解释为"允许将值类型作为引用类型进行威胁".他们用一句话来说是矛盾的.
我更正了关于继承的部分.以下C#类型不是从System.Object派生的:接口,指针,类型参数.
什么是对象?:)我认为这就像数学中的一组.什么是"一切"?

2> Matt Enright..:

派对有点晚了,但是我在SO的搜索结果中发现了这一点,并认为下面的链接可以帮助后代:

Eric Lippert 用一个更好(合格)的陈述非常彻底地讨论了这个问题:

纠正这个神话的方法是简单地将"derives from"替换为"is convertible to",并忽略指针类型:C#中的每个非指针类型都可以转换为object.

它的要点,如果你恨从写编程语言的人阅读以及图示的解释是,(指针除外),诸如此类接口,或泛型参数类型声明("T")不是对象,但保证是可以在运行时作为对象处理,因为它们有一个明确的实例,它将是一个Object.其他类型(类型,枚举,代理,类等)都是对象.包括值类型,可以像其他答案一样讨论对象.



3> Konrad Rudol..:

这里的一些人对面向对象编程中的"对象"有一个奇怪的概念.为了让事情成为一个对象时,它并没有必须是引用类型,或者更一般地说,按照任何正式实施.

所有这一切都意味着您可以在面向对象的世界中作为一流公民进行操作.因为您可以在C#中的值上执行此操作(由于自动装箱),所以一切都确实是一个对象.在某种程度上,这对于函数来说甚至是正确的(但可以说不是类).

这在实践中是否相关是另一个问题,但这是OOP的一个普遍问题,我再次注意到了.没有人清楚OOP的定义(是的,大多数人都同意它与多态性,继承和封装有关,有些人提出"抽象"以获得良好的衡量标准).

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

请注意,在其他上下文中,例如C++,其他方面都受到了强调,因为C++不一定是面向对象的,而且更侧重于低级方面.因此,对象,POD和内置基元之间的区别有时是有意义的(然后有时也是如此).



4> GEOCHET..:

它们都被视为对象,但它们不是所有对象.Autoboxing引起了混乱.

有关更多信息,请参阅此处:http://en.wikipedia.org/wiki/Object_type

这种抽象显然让人困惑.



5> BBetances..:

您将对象与值或引用混淆.基本上,一切都是一个对象.Int是一个对象,但它也是一个值类型.类实例是一个对象,但它也是一个引用类型.

方法不是对象,也不是属性.只是操作对象.是的,几乎所有东西都继承自对象类.



6> Rich..:

我认为值类型不是对象.它们在内存中以不同的方式存储在CLR中 - 值类型存储在堆栈中,对象存储在堆上.您可以将值类型转换为引用类型以使它们像对象一样工作,但CLR将值从堆栈中取出,将其包装在对象中,并将其存储在堆上.这就是当你"装箱"一个变量时会发生的事情.


澄清:当值类型不属于引用类型时,它们仅存储在堆栈中.作为引用类型一部分的值类型与实例的其余部分一起存储在堆上.

7> Sunny Mileno..:

在C#(以及一般的OOP中),我们有类型(类 - 引用,结构 - 值等).这些是定义.而"对象"是给定类型的具体实例.

所以,如果我们按字面意思读出问题,是的,实例化时一切都是对象.

混乱最可能始于为所有事情选择一个基类的名称.在.NET中,这是Object类.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有