繁体   English   中英

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

[英]can a struct be derived from a class in c#?

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

如果没有,为什么原始数据类型(如int)可以从类object派生? 由于数据类型int基本上是结构类型(值类型)。

这仅仅是规则的例外吗?

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

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

Microsof关于类型的文档

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

你不能改变它。

当运行时为类型分配存储位置或生成代码以对其进行操作时,它会检查类型是否派生自System.ValueType但不是System.ValueType本身。 除非存储位置满足这些条件,否则它将保存堆对象引用,并且对其成员(字段,方法,属性等)进行操作的任何代码将对引用的对象起作用。 否则,存储位置将保存该类型的所有公共和私有字段(将在该类型的所有存储位置中相同地布置),并且对其成员进行操作的任何代码将在存储位置本身上操作。

如果尝试将值类型存储到ValueType类的存储位置,或者存储位置不是从ValueType派生,则系统将生成存储位置类型的新堆对象,然后存储对该类型的引用对象在适当的存储位置。 虽然从System.ValueType派生的类型的存储位置和访问它们的代码由运行时特别处理,但是从System.ValueType继承的堆对象实例(例如刚刚提到的新创建的实例)只是堆对象碰巧派生自System.ValueType ,并且具有与其他类型基本相同的继承行为,因此可能由期望处理堆引用的代码传递。

Object Foo = New System.Drawing.Point(3,4);类的语句Object Foo = New System.Drawing.Point(3,4); 实际上涉及三种事情:

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

所有这些的结果是,虽然值类型可以定义为从继承自Object ValueType继承,而类型继承自ValueType堆对象继承自Object ,但值类型的存储位置不包含从Object继承的东西。

类层次结构的工作原理如下(简化):

Object - > ValueType - > int Object - > ValueType - > struct

根据c#的定义,结构不允许继承。

这是一篇很好的文章,描述了st#在C#语言中的作用:

http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM