【问题标题】:How many type objects created in heap for a struct instance?在堆中为结构实例创建了多少类型对象?
【发布时间】: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,我的理解正确吗?

【问题讨论】:

标签: c# .net clr


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2020-06-06
    • 2012-05-13
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多