2012-06-10 47 views
1

我对.NET中的继承感到困惑,这就是为什么。结构是否可以从.NET中的类继承?

我以前的理解是一个结构不能从.NET类继承,因此,例如,以下不会编译:

struct MyStruct : MyClass 
{ 

} 

但是今天我读了整数(等价值类型)是结构体而不是对象,它们继承自ValueType类。 ValueType类继承自System.Object,其目的是覆盖System.Object中的某些方法,以使这些方法适用于值类型。

那么有什么交易?一个结构是否可以从.NET中的类继承,它是否可以或只能在某些情况下才能使用?

由于

+2

重复? http://stackoverflow.com/questions/10727151/if-a-struct-cannot-inherit-another-class-or-struct-why-does-int32-have-a-tostri – Jake1164

+0

@ Jake1164是的,这家伙是基本上问我同样的问题!我的错! – JMK

回答

3

.NET的胆内,对于含有某些成员结构的定义是一样的,其对于那些相同的字段和成员的类的定义,并且其从System.ValueType继承。请注意,编译器将不允许声明继承ValueTypeclass,但是当声明struct时,编译器“幕后”声明了一个类。

什么使.n​​et中的值类型特殊是运行时分配存储位置(变量,字段,参数等)的方式当声明不从ValueType继承的类型的存储位置时,运行时将分配堆对象引用的空间。相比之下,当声明从ValueType继承的类型的存储位置时,运行时将为该类型的所有公用和专用字段分配空间。对于像int这样的类型,系统在正常类型系统之外分配一个特殊基本类型的专用字段。

请注意,值类型的存储位置并不真正包含该类型的实例;而不是该类型的一个实例,而则包含该类型的所有字段。像struct1 = struct2这样的语句不会用实例struct2替代值类型实例struct1。相反,它会将struct2中的所有字段复制到struct1的相应字段中。同样,如果将值类型的存储位置作为方法传递给过程而不使用关键字ref,则传递的内容不是结构实例本身,而是其字段内容。

如果有必要的值型存储位置复制到不从ValueType(例如ObjectIComparable),系统将创建值类型的新堆对象实例派生类型的一个,复制所有字段从值类型添加到新实例,并将对该新实例的引用存储在目标存储位置中。这个过程被称为“拳击”。大多数编译器会隐式地执行此操作,因此试图表现得好像值类型的存储位置持有来自ValueType的对象。不过,需要注意的是,这是一种幻觉。如果类型XY派生,一个有一个名为xxX和一个名为yyY,和一个执行xx = yy,这样的说法应该引起xxyy指同一个对象实例。如果xxyy不是从ValueType派生的类型,即使yy包含从ValueType派生的某个事件的实例,也会发生这种情况。但是,如果xx和/或yy来自ValueType,则不会发生。在这种情况下,系统会将字段从一个实例复制到另一个实例(可能是新实例)。