结构可以从c#中的类派生吗?
如果不是,为什么原始数据类型(如int )可以从object类派生?因为数据类型int基本上是一个结构类型(值类型)。
这只是规则的一个例外吗?
发布于 2012-12-05 01:14:43
整数和其他值类型(例如布尔值)是对象,因为它允许它们利用继承(即它们可以访问常见的.Equals()、.GetType()、.ToString()函数)。
这是.NET框架中的一个设计决策。它们使用公共代码库,而不是为System.ValueType下的所有值类型编写单独的函数。
Microsof's document on Types
发布于 2012-12-05 01:06:22
所有结构都继承System.ValueType,而后者又继承Object。
你不能改变这一点。
发布于 2012-12-05 02:59:23
当运行时为一个类型分配一个存储位置,或者生成对一个类型进行操作的代码时,它会检查该类型是否派生自System.ValueType而不是System.ValueType本身。除非存储位置满足这些条件,否则它将保存一个堆对象引用,以及对其成员(字段、方法、属性等)进行操作的任何代码。将作用于被引用的对象。否则,存储位置将保存该类型的所有公共和私有字段(这些字段将在该类型的所有存储位置中以相同的方式进行布局),并且任何对其成员进行操作的代码都将对该存储位置本身进行操作。
如果试图将值类型存储到类ValueType的存储位置,或者不是从ValueType派生的存储位置,则系统将生成该存储位置类型的新堆对象,然后将对该对象的引用存储在适当的存储位置。尽管从System.ValueType派生的类型的存储位置和访问它们的代码由运行时特殊处理,但从System.ValueType继承的堆对象实例(例如刚刚提到的新创建的对象)只是碰巧从System.ValueType派生的堆对象,并且具有本质上与其他类型相同的继承行为,因此可以由期望处理堆引用的代码传递。
像Object Foo = New System.Drawing.Point(3,4);这样的语句实际上涉及三种内容:
System.Drawing.Point(3,4)类型的未命名临时存储位置,保存该类型的私有字段(两个整数),并初始化为(3,4)。请注意,此存储位置不包含Object;它包含两个整数,编译器知道这两个整数表示其字段。System.Drawing.Point类型的堆对象。因为这是一个堆对象,所以它继承自System.Object,所有的堆对象也是如此。Object类型的存储位置,由变量名Foo表示。所有这一切的结果是,虽然值类型可能被定义为继承自ValueType (继承自Object ),并且其类型继承自ValueType的堆对象确实继承自Object,但值类型的存储位置并不保存从Object继承的内容。
https://stackoverflow.com/questions/13708137
复制相似问题