【发布时间】:2021-05-02 01:06:43
【问题描述】:
我们知道对于类,例如public class Employee {},
当我们创建它的一个实例时,会在堆中创建一个Employee对象,而CLR预先创建了一个Type对象(System.Type的一个实例),这样Employee对象就持有了一个指向该type对象的指针。由于所有类型都继承自System.Object,因此CLR也提前为System.Object创建了一个类型对象。
现在假设我们将类更改为 struct 为public struct Employee {},当我们在 Program 的 Main 方法中将它的实例创建为局部变量时,将在堆上创建多少类型对象?我的假设是三个,一个是结构本身,另一个是System.ValueType的类型对象,因为所有结构都继承自System.ValueType,并且由于System.ValueType也继承自System.Object,所以创建了第三种类型对象CLR 为System.Object,我的理解正确吗?
【问题讨论】:
-
如果你真的想知道这些技术性很强的问题的答案,去获取源代码github.com/dotnet/runtime,阅读它,编译它,逐步完成它等等。
-
我想1.
Object和ValueType的类型对象(如果存在)会很早就被初始化2.这没什么区别,因为它是一个实现细节,而且是一个相当小的细节。