CLR是在每次方法调用之前在堆上创建Type对象还是只使用已经创建的Type对象?

时间:2018-02-05 17:07:13

标签: c# .net clr

我的问题是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对象?

1 个答案:

答案 0 :(得分:0)

回答你的最后一个问题:

  

CLR会创建两个类型对象,还是会使用已创建的Type   宾语?

它将使用已创建的

在这里,直接来自Jeffery Ritcher CLR通过C#史诗书:

  

在Main方法执行之前,CLR会检测所有类型   由Main的代码引用。这会导致CLR分配一个   内部数据结构,用于管理对。的访问   引用类型。在图1-4中,Main方法指的是单个方法   type,Console,导致CLR分配单个内部   结构体。此内部数据结构包含每个的条目   Console类型定义的方法。每个条目都保存地址   可以找到方法的实现。初始化时   结构,CLR将每个条目设置为内部的,未记录的   包含在CLR本身内部的函数。我叫这个功能   JIT编译器。

enter image description here

所以这最终意味着运行时将在执行执行方法之前第一次创建Type,如果该类型存在于不同的程序集中,它将首先尝试加载该程序集(当然在程序集清单文件中使用程序集引用元数据)