在堆中为结构实例创建了多少类型对象?

问题描述

我们知道对于类,例如 public class Employee {}, 当我们创建它的实例时,会在堆中创建一个Employee对象,CLR预先创建了一个Type对象(System.Type一个实例),这样Employee对象就持有一个指向该类型对象的指针.由于所有类型都继承自System.Object,因此System.Object的类型对象也是由CLR预先创建的。

现在假设我们将类更改为 struct as public struct Employee {} 并且当我们在 Program 的 Main 方法中创建它的实例作为局部变量时,将在堆上创建多少类型对象?我的假设是三个,一个是结构本身,另一个System.ValueType 的类型对象,因为所有结构都继承自 System.ValueType,而且 System.ValueType 也继承自 System.Object ,所以第三种类型的对象是由 CLR 为 System.Object 创建的,我的理解是否正确?

解决方法

System.Type 被记住了,每次实例化任何给定类型的对象时都不会创建 System.Type 实例,这将是非常浪费的。你可以简单地检查一下:

var type1 = (new Foo()).GetType();
var type2 = (new Foo()).GetType();
var areSame = ReferenceEquals(type1,type2); //returns true

至于创建这些记忆类型实例的时间、方式和顺序,我通常不需要了解详细信息。坦率地说,我发现很难想出一个场景,这些知识会有用。关心进一步详细说明为什么您需要知道确切的机制?