结构可以继承.NET中的类吗?

时间:2012-06-10 17:59:52

标签: class inheritance struct

我对.NET中的继承感到困惑,这就是原因。

我以前的理解是结构不能从.NET继承,所以例如,以下内容不会编译:

struct MyStruct : MyClass
{

}

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

那是什么交易?一个结构可以继承自.NET中的一个类,它是否可以仅在某些情况下才能继承?

由于

1 个答案:

答案 0 :(得分:3)

在.net的内容中,包含某些成员的结构的定义与那些具有相同字段和成员的类的定义相同,并且继承自System.ValueType。请注意,编译器不允许声明继承class的{​​{1}},但当一个声明ValueType时,编译器“幕后”声明了一个类。

在.net中使值类型特殊的原因是运行时分配存储位置(变量,字段,参数等)的方式当声明未继承自struct的类型的存储位置时,运行时将为堆对象引用分配空间。相反,当声明继承自ValueType的类型的存储位置时,运行时将为该类型的所有公共和私有字段分配空间。对于类似ValueType的类型,系统在普通类型系统之外分配一个特殊基本类型的私有字段。

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

如果有必要将值类型存储位置复制到不是从ref派生的类型(例如ValueTypeObject),系统将创建一个新堆 - 值类型的对象实例,将值类型中的所有字段复制到该新实例,并将对该新实例的引用存储在目标存储位置中。这个过程叫做“拳击”。大多数编译器都会隐式执行此操作,因此尝试表现为值类型存储位置保存从IComparable派生的对象。但值得注意的是,这是一种幻觉。如果类型ValueType派生自X,则其中一个Y名为Xxx名为Y,其中一个执行yy },这样的语句应该导致xx = yyxx引用同一个对象实例。如果yyxx类型不是从yy派生的,即使ValueType包含从yy派生的内容的实例,也会发生这种情况。但是,如果ValueType和/或xx来自yy,则不会发生这种情况。在这种情况下,系统会将字段从一个实例复制到另一个实例(可能是新实例)。