我的问题是CLR在每次方法调用之前是否在堆上创建了Type对象,还是只使用已经创建的Type对象? 例如,假设我们有Person类和两个使用此Person类型的方法。
class Program
{
static void Main(string[] args)
{
Method1();
Method2();
}
static void Method1()
{
Person p = new Person();
}
static void Method2()
{
Person p = new Person();
}
}
class Person
{
public string Name { get; set; }
}
正如我们所知,CLR在执行之前扫描方法体,以便为此方法使用的类型创建Type对象。那么,在这种情况下会创建多少Person类型对象? CLR会创建两个类型对象,还是会使用已创建的Type对象?
答案 0 :(得分:0)
回答你的最后一个问题:
CLR会创建两个类型对象,还是会使用已创建的Type 宾语?
它将使用已创建的
在这里,直接来自Jeffery Ritcher CLR通过C#史诗书:
在Main方法执行之前,CLR会检测所有类型 由Main的代码引用。这会导致CLR分配一个 内部数据结构,用于管理对。的访问 引用类型。在图1-4中,Main方法指的是单个方法 type,Console,导致CLR分配单个内部 结构体。此内部数据结构包含每个的条目 Console类型定义的方法。每个条目都保存地址 可以找到方法的实现。初始化时 结构,CLR将每个条目设置为内部的,未记录的 包含在CLR本身内部的函数。我叫这个功能 JIT编译器。
所以这最终意味着运行时将在执行执行方法之前第一次创建Type,如果该类型存在于不同的程序集中,它将首先尝试加载该程序集(当然在程序集清单文件中使用程序集引用元数据)