如何解决在堆中为结构实例创建了多少类型对象?
我们知道对于类,例如 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
至于创建这些记忆类型实例的时间、方式和顺序,我通常不需要了解详细信息。坦率地说,我发现很难想出一个场景,这些知识会有用。关心进一步详细说明为什么您需要知道确切的机制?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。