结构可以从c#中的类派生吗?
如果没有,为什么原始数据类型(如int)可以从类object
派生?由于数据类型int基本上是结构类型(值类型)。
这仅仅是规则的例外吗?
答案 0 :(得分:9)
整数和其他值类型(例如bool)是对象,因为它允许它们利用继承(即它们可以访问常见的.Equals()
,.GetType()
,.ToString()
函数。
这是.NET框架中的设计决策。它们不是为System.ValueType下的所有值类型编写单独的函数,而是使用公共代码库。
答案 1 :(得分:7)
所有结构都继承System.ValueType
,后者继承Object
。
你不能改变它。
答案 2 :(得分:1)
当运行时为类型分配存储位置或生成代码以对其进行操作时,它会检查类型是从System.ValueType
派生而不是System.ValueType
本身。除非存储位置满足这些条件,否则它将保存堆对象引用,并且对其成员(字段,方法,属性等)进行操作的任何代码将对引用的对象起作用。否则,存储位置将保存该类型的所有公共和私有字段(将在该类型的所有存储位置中以相同方式布置),并且对其成员进行操作的任何代码将在存储位置本身上运行。
如果尝试将值类型存储到类ValueType
的存储位置,或者存储位置不是从ValueType
派生,则系统将生成一个新的堆对象。存储位置的类型,然后将该对象的引用存储在适当的存储位置。虽然派生自System.ValueType
的类型的存储位置和访问它们的代码由运行时特别处理,但是从System.ValueType
继承的堆对象实例(例如刚刚提到的新创建的实例)是简单的堆对象,它们碰巧派生自System.ValueType
,并且具有与其他类型基本相同的继承行为,因此可能会被期望处理堆引用的代码传递。
像Object Foo = New System.Drawing.Point(3,4);
这样的陈述实际上涉及三种事情:
所有这一切的结果是,虽然值类型可以定义为继承自ValueType
的{{1}},而类型继承自Object
的堆对象继承自ValueType
值类型的{1}},存储位置不包含从Object
继承的内容。
答案 3 :(得分:0)
类层次结构的工作原理如下(简化):
对象 - > ValueType - > INT 对象 - > ValueType - >结构
根据c#的定义,结构不允许继承。
这是一篇很好的文章,描述了结构在C#语言中的作用:
http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx