.NET的胆内,对于含有某些成员结构的定义是一样的,其对于那些相同的字段和成员的类的定义,并且其从System.ValueType
继承。请注意,编译器将不允许声明继承ValueType
的class
,但是当声明struct
时,编译器“幕后”声明了一个类。
什么使.net中的值类型特殊是运行时分配存储位置(变量,字段,参数等)的方式当声明不从ValueType
继承的类型的存储位置时,运行时将分配堆对象引用的空间。相比之下,当声明从ValueType
继承的类型的存储位置时,运行时将为该类型的所有公用和专用字段分配空间。对于像int
这样的类型,系统在正常类型系统之外分配一个特殊基本类型的专用字段。
请注意,值类型的存储位置并不真正包含该类型的实例;而不是是该类型的一个实例,而则包含该类型的所有字段。像struct1 = struct2
这样的语句不会用实例struct2
替代值类型实例struct1
。相反,它会将struct2
中的所有字段复制到struct1
的相应字段中。同样,如果将值类型的存储位置作为方法传递给过程而不使用关键字ref
,则传递的内容不是结构实例本身,而是其字段内容。
如果有必要的值型存储位置复制到不从ValueType
(例如Object
或IComparable
),系统将创建值类型的新堆对象实例派生类型的一个,复制所有字段从值类型添加到新实例,并将对该新实例的引用存储在目标存储位置中。这个过程被称为“拳击”。大多数编译器会隐式地执行此操作,因此试图表现得好像值类型的存储位置持有来自ValueType
的对象。不过,需要注意的是,这是一种幻觉。如果类型X
从Y
派生,一个有一个名为xx
的X
和一个名为yy
Y
,和一个执行xx = yy
,这样的说法应该引起xx
和yy
指同一个对象实例。如果xx
和yy
不是从ValueType
派生的类型,即使yy
包含从ValueType
派生的某个事件的实例,也会发生这种情况。但是,如果xx
和/或yy
来自ValueType
,则不会发生。在这种情况下,系统会将字段从一个实例复制到另一个实例(可能是新实例)。
重复? http://stackoverflow.com/questions/10727151/if-a-struct-cannot-inherit-another-class-or-struct-why-does-int32-have-a-tostri – Jake1164
@ Jake1164是的,这家伙是基本上问我同样的问题!我的错! – JMK