首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构可以从c#中的类派生吗?

结构可以从c#中的类派生吗?
EN

Stack Overflow用户
提问于 2012-12-05 01:05:08
回答 4查看 3.8K关注 0票数 8

结构可以从c#中的类派生吗?

如果不是,为什么原始数据类型(如int )可以从object类派生?因为数据类型int基本上是一个结构类型(值类型)。

这只是规则的一个例外吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-05 01:14:43

整数和其他值类型(例如布尔值)是对象,因为它允许它们利用继承(即它们可以访问常见的.Equals().GetType().ToString()函数)。

这是.NET框架中的一个设计决策。它们使用公共代码库,而不是为System.ValueType下的所有值类型编写单独的函数。

Microsof's document on Types

票数 9
EN

Stack Overflow用户

发布于 2012-12-05 01:06:22

所有结构都继承System.ValueType,而后者又继承Object

你不能改变这一点。

票数 7
EN

Stack Overflow用户

发布于 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);这样的语句实际上涉及三种内容:

  1. System.Drawing.Point(3,4)类型的未命名临时存储位置,保存该类型的私有字段(两个整数),并初始化为(3,4)。请注意,此存储位置不包含Object;它包含两个整数,编译器知道这两个整数表示其字段。
  2. System.Drawing.Point类型的堆对象。因为这是一个堆对象,所以它继承自System.Object,所有的堆对象也是如此。
  3. Object类型的存储位置,由变量名Foo表示。

所有这一切的结果是,虽然值类型可能被定义为继承自ValueType (继承自Object ),并且其类型继承自ValueType的堆对象确实继承自Object,但值类型的存储位置并不保存从Object继承的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13708137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档