图片 24

品类根基及项目,线程栈和托管堆在运作时的互相关系

1、线程栈

本节将解释类型、对象、线程栈和托管堆在运行时的互相关系。别的,还将表明调用静态方法、实例方法和虚方法的界别。

  CL帕杰罗须要具有项目最后都要从System.Object派生。也便是所,上面包车型大巴五个概念是完全相像的,

window的三个进度加载clr。该进程或者包涵八个线程,线程创制的时候会分配1MB的栈空间。

若果有以下多少个类定义:

internal class Employee

{

    public Int32 GetYearsEmployed() { … }

    public virtual string GetProgressReport() { … }

    public static Employee Lookup(string name) { … }

}

internal sealed class Manager : Employee

{

    public override string GetProgressReport() { … }

}

     
大家得windows进度早就运行,CL君越已加载到此中,托管堆已最先化,并且已创建二个线程(连同它的1MB的栈空间卡塔 尔(英语:State of Qatar)。该线程已实施了某些代码,未来随时要调用M3的艺术。下图展现了当下的风貌。M3方法包涵的代码演示了CLKoleos是哪些做事的,平常不会这么写,因为它们并未做什么真正实用的事务。

//隐式派生自System.Object
class Employee {
    .....
}

//显示派生子 System.Object
class Employee : System.Object {
  .....  
}

如图:

图片 1

  由于有着品类最后都以从System.Object派生的,所以能够保障各类类别的各类对象皆有大器晚成组最焦点的艺术。

 void Method()

     
当JIT编写翻译器将M3的IL代码转变花费地CPU指令时,会小心到M3内部援用的兼具项目:Employee,Int32,Manager以至String(因为“Joe”卡塔 尔(英语:State of Qatar)。那个时候,CL科雷傲要有限支撑定义了这么些项目标保有程序集皆已加载。然后,利用程序集的元数据,CL兰德酷路泽提取与那么些体系有关的新闻,并创建一些数据结构来表示项目小编。下图显示了为Employee和Manager类型对象使用的数据结构。由于那一个线程在调用M3此前已经实行了有个别代码,所以无妨假定Int32和String类型对象已经创办好了,所以图中不展现它们。

  System.Object提供了如下所示的公物实例方法。  

{

图片 2

Equals(Object) 确定指定的对象是否等于当前对象。如果两个对象具有相同值就返回ture.
GetHashCode 返回对象的值得一个哈希码。如果某个类型的对象要在哈希表集合中作为key使用,该类型应该重写这个方法。方法应该为不同的对象提供一个良好的分布。
ToString 该方法默认返回类型的完整名称(this.GetType().FullName)。
GetType 返回从Type派生的一个对象的实例,指出调用GetType的那个对象是什么类型。返回的Type类型可以与反射类配合使用,从而获取与对象的类型相关的元数据信息。

  string name=”zhangsan”;  //name 被放入栈里面

     
让大家花点时间来琢磨一下这个连串对象。本章后边讲过,堆上的享有目的都包含多个附加的积极分子:类型对象指针(type
object pointer卡塔尔和一块块索引(sync block
index卡塔 尔(阿拉伯语:قطر‎。如图所示,Employee和Manager类型对象都有那八个分子。定义叁个档期的顺序时,能够在类型的在那之中定义静态数据字段。为这个静态数据字段提供支援的字节是在项目对象自己中分配的。在各种项目对象中,最终都富含三个方法表。在形式表中,类型中定义的各种方法都有多少个相应的记录项。大家曾经在率先章商讨过那几个方法表。由于Employee类型定义了3个办法,所以Employee的点子表中有3个记录项。Manager类型只定义了三个艺术,所以Manager的主意表中唯有1个记录项。

     
未来,当CL卡宴明确方法必要的享有品类对象皆是开立,并且M3的代码已经编写翻译之后,就允许线程最早实行M3的本地代码。M3的“序幕”代码执行时,必得在线程栈中为一些变量分配内部存款和储蓄器,如图4-8所示。顺便说一句,作为艺术的“序幕”代码的少年老成有的,CL福睿斯会自动将具有片段变量起头化为null或0(零卡塔 尔(英语:State of Qatar)。但是,如若准备从三个并未有显式起头化的片段变量读取数据,C#会告诉错误新闻:使用了未赋值的有的变量。

  

       Method2(name);  //1参数变量s 被压入栈,s援引name的地点   
2.重临地址被压入栈,方法施行完(method2的 return卡塔 尔(英语:State of Qatar)指针指向此重临地址

图片 3

  System.Object的受保险方法  

       return;    

     
然后,M3推行它的代码来布局几个Manager对象。那以致在托管堆中开创Manager类型的三个实例(也正是贰个Manager对象卡塔 尔(英语:State of Qatar),如图4-9所示。能够看看,和兼具指标同样,Manager对象也是有三个类型对象指针和一同块索引。该目的还带有须求的字节来容纳Manager类型定义的有所实例数据字段,以至容纳由Manager的别样基类(本例就是Employee和Object卡塔尔国定义的装有实例字段。任曾几何时候在堆上新建三个指标,CL中华V都会自行发轫化内部类型对象指针成员,让它援用与对象对应的花色对象(本例正是Manager类型对象卡塔尔。别的,CLMurano会先开始化同步块索引,并将对象的具备实例字段设为null或0(零卡塔 尔(英语:State of Qatar),再调用类型的构造器(它实质上是可能修正某个实例数据字段的一个情势卡塔尔。new操作符会重回Manager对象的内部存款和储蓄器地址,该地方保存在变量e中(e在线程栈上卡塔 尔(英语:State of Qatar)。

MemberwiseClone 这个非虚方法能创建类型的一个新实例,并将对象的实例字段设为与this对象的实例字段完全一致。返回的是对新实例的一个引用
Finalize 在垃圾回收器判断对象应该被作为垃圾收集之后,在对象的内存被实际回收之前,会调用这个虚方法。需要在回收之前执行一些清理工作的类型应该重写这个方法。

}

图片 4

  

 

     
M3的下风流倜傥行代码调用Employee的静态方法Lookup。调用二个静态方法时,CLLacrosse会定位与概念静态方法的品类对应的品类对象。然后,JIT编写翻译器在类型对象的措施表中寻找与被调用的艺术对应的记录项,对艺术进行JIT编写翻译(假如须求的话卡塔尔国,再调用JIT编写翻译的代码。就本例来讲,假定Employee的Lookup方法要查询叁个数据库来查找Joe。别的,假定数据库建议Joe
是公司的一名老总,所以在此中,Lookup
方法在堆上构造八个新的Manager对象,用Joe的音讯最初化它,然后回来该对象的地点。这些地点保存到有些变量e中。那几个操作的结果如图4-10所示。

  CL大切诺基供给具有指标都以用new操作符来创制。举例  

void Method2(string s)

图片 5

Employee e = new Employee("ConstructorParam1");

{

     
注意,e不再引用第贰个Manager对象。事实上,由于并没有变量引用那几个指标,所以它是以往展开垃圾回笼时的首要指标。垃圾回收机制会活动回笼(释放卡塔尔这些指标占用的内部存款和储蓄器。

      M3的下风流倜傥行代码调用Employee
的非虚实例方法GetYearsEmployed。调用多个非虚实例方法时,JIT编写翻译器会找到与“发出调用的十一分变量(e)的门类(Employee)”对应的项目对象(Employee类型对象卡塔尔国。本例中,变量e被定义成贰个Employee。若是Employee类型没有定义正在调用的百般形式,JIT编译器会想起类档期的顺序结构(一向回溯到Object卡塔尔,并在沿途的各样项目中查找该措施。之所以能这么回忆,是因为每一种品种对象都有四个字段援用了它的基类型,那几个音讯在图中尚无显得。

      然后,JIT
编写翻译器在品种对象的章程表中检索引用了被调用方法的记录项,对艺术实行JIT
编写翻译(如若须求的话卡塔尔国,再调用JIT编写翻译的代码。就本例来说,假定Employee的GetYearsEmployed方法再次回到5,因为Joe已被厂家雇佣了5年。那些大背头保存在一些变量year中。那几个操作的结果如图4-11所示。

  以下是new操作符所做的事务:

  int32 length=s.Length;

图片 6

  1卡塔 尔(英语:State of Qatar)它总计类型及其具备基类型(平昔到System.Object卡塔 尔(阿拉伯语:قطر‎中定义的有着实例需求的字节数。堆上的各样对象都急需一些非凡的开支成员——”类型对象指针(type
object pointer)”和”同步块索引“(sync block
index)。这么些分子由CLSportage用于管理对象。那些额外成员的字节数会计入对象大小。

       int32 tally;

     
M3的下后生可畏行代码调用Employee的黑幕例方法GenProgressReport。调用多少个来历例方法时,JIT
编写翻译器要在点子中生成一些至极的代码;方法每便调用时,都会履行这几个代码。那个代码首先检查发出调用的变量,然后跟随地址来到发出调用的靶子。在本例中,变量e引用的是意味着“Joe”的叁个Manager对象。然后,代码检核对象内部的“类型对象指针”成员,那个成员指向对象的实际类型。然后,代码在档案的次序对象的措施表中寻觅援引了被调用方法的记录项,对议程开展JIT编写翻译(假使要求的话卡塔 尔(英语:State of Qatar),再调用JIT编写翻译过的代码。就本例来讲,由于e援用叁个Manager对象,所以会调用Manager的GenProgressReport完毕。这一个操作的结果如图4-12所示。

  2卡塔 尔(英语:State of Qatar)它从托管堆中分红钦命项目必要的字节数,进而分配成对象的内部存款和储蓄器,分配的富有字节都设为零(0)。

  return;   
//methed2实行完后,指针指向线程栈的回来地址,method2的栈帧张开

图片 7

  3卡塔 尔(英语:State of Qatar)它起头化对象的”类型对象指针”和”同步块索引”成员。

}

     
注意,如果Employee的Lookup方法发现Joe只是三个Employee,实际不是三个Manager,Lookup会在里边结构一个Employee对象,它的品种对象指针将引用Employee类型对象。那样一来,最后试行的就是Employee的GenProgressReport完成,实际不是Manager的GenProgressReport完成。

     
至此,我们曾经探究了源代码、IL和JIT编写翻译的代码之间的涉嫌。还斟酌了线程栈、实参、局部变量以至这一个实参和变量怎样援引托管堆上的指标。我们还了然对象中带有叁个指针,它指向对象的项目对象(类型对象中蕴藏静态字段和方法表卡塔尔国。我们还切磋了JIT编写翻译器如何决定静态方法、非虚实例方法以致背景例方法的调用方式。领悟那后生可畏体之后,能够深远地认知CL福睿斯的做事方法。以往在创建、设计和达成项目、组件以致应用程序时,这几个知识会带给不小援助。在结束本章早先,让大家更加尖锐地探究一下CL冠道内部发生的业务。

     
注意,Employee和Manager类型对象都包括“类型对象指针”成员。这是由于项目对象本质上也是指标。CLPRADO创设项目对象时,必需开首化这一个分子。早先化成怎么样吗?CLCR-V开端在三个进度中运作时,会登时为MSCorLib.dll中定义的System.Type类型成立四个特别的品类对象。Employee和Manager类型对象都是该类型的“实例”。由此,它们的门类对象指针成员会先河化成对System.Type类型对象的引用,如图4-13所示。

  4卡塔 尔(英语:State of Qatar)调用类型的实例构造器,向其扩散对new的调用中内定的别的实参(本例中是”ConstructorParam1″)。大许多编写翻译器都在构造器中自动生成代码来调用二个基类的构造器。各种类别的构造器在被调用时,都要担当起头化那一个类型定义的实例字段。最后调用的是System.Object的构造器,该构造器只是轻巧的归来,不会做此外任何业务。

图片 8

图片 9

  new
推行了有着的操作后,会回来实行新建对象的二个引用。在本例中,那么些引用会保存到变量e中,具备Employee类型。

2.运营时提到

     
当然,System.Type类型对象自己也是三个指标,内部也许有三个“类型对象指针”成员。那么那么些指针指向的是何等啊?它指向它本身,因为System.Type类型对象自己是二个种类对象的“实例”。现在,大家好不轻易明白了CLENVISION的不论什么事项目系统会同职业格局。顺便说一句,System.Object的GetType方法再次来到的是积攒在内定对象的“类型对象指针”成员中的地址。换言之,GetType方法重回的是指向目的的体系对象的二个指针。那样一来,就足以看清系统中任何对象(包罗项目对象自己卡塔尔的实际类型。

  注意:上面提到过”类型对象指针”,项目对象不是花色的靶子/实例,这两侧是有分别的。

现成如下2个连串

 

  ———————————————————————————-

internal class Employee

  CLENCORE最重大特点之风姿罗曼蒂克正是类别的安全性。在运作时,CL昂Cora始终通晓一个目的的品种,能够调用GetType方法,拿到目的的花色。

{

  CLEvoque允许将贰个对象调换为它的实际类型也许它的别样基类型。

  public int32 M1(){…..};

  C#不必要利用异乎平日语法就能够将叁个指标转换为它的别的及项目,因为向基类型的调换被以为是风华正茂种安全的隐式转变。可是,将对象转变为它的有些派生类时,C#务求开荒人士只好举办展示转换,因为那样的转移在运行时也许停业。

  public virtual string M2(){…..};

   public static void Main() {
      // 不需要转型
      Object o = new Employee();

      // 需要进行强制类型转换
      Employee e = (Employee) o;
   }

  public static Employee M3(string name){…..};

  在C#言语中张开类型调换的另生龙活虎种方法是利用is操作符。is操作符检查二个目的是或不是同盟钦点的门类,并赶回二个Boolean值(true和false卡塔尔国。注意,is操作符是不会回到格外音信的。

}

  is操作符平常那样使用:

internal sealed class Manager:Employee

  if ( o is Employe ){
       Employee e = (Employee) o;
  }

{

  在这里段代码中,CL奥迪Q7实际是会检讨四遍对象的项目。is操作符首先核查o是不是包容Employee类型。若是是,在if内部,CLRubicon还会再也核算o是或不是援用三个Employee。CL哈弗的档次检查加强的安全性,但可信也会对品质变成一定影响。

  public override string M2(){…..};

  C#专门提供了 as 操作符,指标正是简化这种代码的写法,同不常候进级质量。

}

  as操作符平常那样使用:

预备:window过程已经拉开,clr已经加载到进程之中,托管堆已经最初化,线程栈也生龙活虎度被创立(连同它的1MB的栈空间卡塔尔

  Employee e = o as Employee;
  if ( e != null ){
      //在if中使用e
  }

void M4()

  as操作符的行事办法与强制类型调换相同,只是它是不会抛出非常的,假诺不能转变,结果就是null。所以,正确的做法正是反省最后生成的引用是或不是为null。就算谋算直接接收转变后的引用,就能抛出十一分。

{

 

  Employee e;


  int32 age;

  

  e=new Manager();

   命名空间(namespace)用于对相关的项目进行逻辑分组,开拓职员使用命名空间来方便的稳固叁个品种。

  e=Employee.M3(“zhangsan”);

  命名空间和程序集不自然是皮之不存毛将焉附的,也便是说它们中间平素不必然联系。

  age=e.M1();


  e.M2();

  以后将解释类型、对象、线程栈和托管堆在运营时的竞相沟通。别的,还将表明调用静态方法、实例方法和虚方法的分裂。

}

  大家先从线程栈发轫。

a.首先介绍下new 关键字的施行的时候会实践什么样

  1.
图4-2来得了已加载了CL帕杰罗的叁个Windows进度。在此个进程中,可能存在七个线程。贰个线程创设时,会分配到一个1MB尺寸的栈。这些栈的空中用于向方法传递实参,并用以方法内部定义的有的变量。图4-2来得了贰个线程的栈内部存款和储蓄器(右边)。栈是从高地址向低地址构建的。在图中,线程已执行了一些代码,未来,假定线程初阶实行的代码要调用M1方法了。

1.clr测算出类型的兼具实例字段的字节和享有基类型的实例字段的字节长度,创立项目对象指针和同步块索引(也算算在字节长度内卡塔尔

  图片 10

2.在托管堆上分配第一步长度的上空

  2.
在叁个最基本的点子中,会有一点”序幕”代码,担当在点子开端时做它工作在此之前对其進张开头化。此外,还满含了”尾声”代码,担当在措施成功工作之后对其举办清理,然后才重回至调用者。M1方法开始实行时,它的”序幕”代码就能在线程栈上分红局地变量name的内部存款和储蓄器,如图4-3所示。

3.伊始化类型对象指针(指向类型对象卡塔尔国和联合块索引

  图片 11

4.调用处指标实例构造器。

  3.
然后,M1调用M2的办法,将有个别变量name作为四个实参来传递。那导致name局地变量中的地址被压入栈(参见图4-4)。在M2方法内部,将接受名称叫s的参数变量来标志栈地点(有的CPU架构会通过贮存器来传递实参,以拉长质量)。别的,调用一个主意时,还有大概会将一个”再次来到地址”压入栈中。被调用的不二法门在收尾后,应该回到到那一个职位(同样参见图4-4)。

 b.运转关系图

  图片 12

图片 13

  4. M2的章程开首推行时,它的”序幕”代码正是在线程栈中为局地变量length和tally分配内部存款和储蓄器。如图4-5所示。

 

  图片 14

 

  5. 然后,M2方法内部的代码初步试行。最后,M2到达它的return语句,形成CPU的吩咐指针棉被服装置成栈中的重临地址,何况M2的栈帧博览会开,

 c.详明

使之看起来好像于图4-3。之后,M1将继续施行在M2调用之后的代码,M1的栈帧将正确反映M1须要的境况。

       1.M4周转的时候 先在线程栈 压入e和age四个部分变量

   图片 15

  2.e=new
Manager();会在托管推上分配Manager和装有基类的实例字段字节大小,早先化类型对象指针,指向Manager类型对象。

  6.
最终,M1会回到到它的调用者。相符的是通过CPU的指令指针设置成重返地址来落到实处的(那个重临地址在图中未呈现,但它应当适逢其会在栈中的name实参上方),何况M1的栈帧交易会开,使之看起来好像于图4-2。之后,调用了M1的方法会继续实施在M1之后的代码,这一个格局的栈帧将标准反映它须求的情景。

  3 Employee.M3(“zhangsan”);
第八个对象将被垃圾回笼器回笼。他会找到调用它的类型,然后去档案的次序对象的不二等秘书诀列表中找到那一个办法,

  图片 16

    然后JIT进行编写翻译,然后施行。

  CL传祺运作关系

  4.e.M1();找到e对象类型对应的靶子类型Manager(未有,回溯到Employee中找卡塔 尔(英语:State of Qatar),在措施列表中找到相应的不二秘籍,编写翻译试行(能够提升回溯是因为在派生类中有指向基类的征引卡塔 尔(阿拉伯语:قطر‎

  1. 倘使以往有以下四个类的概念:

  5.e.M2()找到e对象的的指标类型(Manager卡塔 尔(英语:State of Qatar),调用Manager类型对象方法列表中的M2
并非Employee中的。

  

 

internal class Employee {
    public               int32         GetYearsEmployed()       { ... }
    public    virtual    String        GenProgressReport()      { ... }
    public    static     Employee      Lookup(String name)      { ... }     
}
internal sealed class Manager : Employee {  
    public    override   String         GenProgressReport()    { ... }
}     

  2.
大家的Windows进度已开发银行,CLRAV4已加载到里头,托管堆已初步化,并且已开立多个线程(连同它的1MB的栈空间卡塔尔。该线程已实施了有个别代码,将来立马将在调用M3的措施。图4-6来得了如今的景色。M3方法包罗的代码演示了CL福睿斯是如何是好事的。

   图片 17

  3.
当JIT编写翻译器将M3的IL代码调换到为本土CPU指令时,会专一到M3的中间援用的具备连串:Employee、Int32、Manager以至String(因为”Joe”卡塔 尔(阿拉伯语:قطر‎。这时,CL悍马H2要力扬州义了这一个品种的有所程序集都已加载。然后,利用那一个程序集的元数据,CL宝马X3提取与那几个项目有关的音信,并创设一些数据结构表示项目小编。图4-7显得了为Employee和Manager类型对象使用的数据结构。由于那一个线程在调用M3以前已经推行了一些代码,全体不要紧假定Int32和String类型对象已经创办好了,所以图中从不显得它们。

   

  4.
先前提过,堆上的享有目的上都包蕴八个附加的积极分子:”类型对象指针”和”同步块索引”。如图4-7所示,Employee和Manager类型对象都有那四个分子。定义一个种类时,能够在类型的个中定义静态数据字段。为那几个静态字段数据提供支撑的字节是在品种对象自己中分红到的。在各样品种对象中,都包括贰个方法表。在格局表中,类型中定义的种种方法都有二个应和的笔录项。由于Employee有3个艺术就有3个记录项,Manager唯有叁个主意,也就唯有叁个记录项。

  图片 18

   

  5.
现行反革命,当CL奥迪Q3鲜明方法须要的具有类型对象都已经创办了,况兼M3的代码也早已编写翻译好了,就允许线程最初实施M3的本地代码。M3的”序幕”代码实践时,必需在线程栈中为局地变量分配内部存款和储蓄器,如4-8所示。作为艺术的”序幕”代码的风姿洒脱有的,CLEscort会自定将具备片段变量开始化为null或零(0)。

   图片 19

  6.
然后,M3试行它的代码来布局二个Manager对象。那就能够在托管堆中开创Manager类型的二个实例(也正是Manager对象)。如4-9所示。和持有目标同样,Manager对象也可能有一个”类型对象指针”和”同步块索引”。该指标还包括须求的字节来容纳Manager类型定义的具备实例数据字段,以致容纳由Manager的别的基类(Employee和Object)定义的保有实例字段。任曾几何时候在堆上新建三个对象,CL科雷傲都会自动早先化内部”类型对象指针”,让它引用(或针对)与对象对应的品类对象(本例正是Manager类型对象)。另外,CLLX570会先初阶化”同步块索引”,并将对象的具备实例字段设为nll或为零(0),在调用类型的构造器(它实质上是可能修正某个实例字段的叁个措施)。new操作符会重返Manager对象的内存地址,该内部存款和储蓄器地址保存在变量e中(e在线程栈上)。

   图片 20

  7.
M3的下大器晚成行代码调用Employee的静态方法Lookup。调用二个静态方法时,CLCR-V会定位到与定义静态方法的项目对应的品种对象。然后,JIT编译器在档次对象的主意表中寻找被调用的主意对应的记录项,对该办法开展JIT编写翻译(假使供给的话),再调用JIT编写翻译后的代码。就本例,假定Enployee的Lookup方法要询问数据中的Joe。其余,假定数据库中建议Joe是为Manager,所以在里边,Lookup方法在堆上构造多少个新的Manager对象,用Joe的新闻最初化它,然后回来该对象的地点。那一个地点保存在一些变量e中。如图4-10所示。值得注意的是,e不再援引第七个Manager对象。事实上,由于尚未变量援引第二个Manager对象,所以它是今日拓宽垃圾回笼时的根本目的。

  图片 21

  8.
M3的下豆蔻梢头行调用Employee的非虚实例方法GetYearsEmployed。调用贰个非虚实例方法时,JIT编写翻译器会找到与”发出调用的不得了变量(e)的档期的顺序(Emplyee)”对应的档案的次序对象(Employee类型对象)。在本例中,变量e被定义成为叁个Employee。如若Employee类型未有定义这几个办法,JIT编写翻译器会想起类档期的顺序结构(平素到Object),并在沿途的种种连串中查找该方法。之所以能这么回想,是因为各种门类对象都有多个字段援用了它的基类型,但在图中未有出示。然后,JIT编写翻译器在等级次序对象的措施表中搜索引用了被调用方法的记录项,对艺术开展JIT编译(要是需求的话),再调用JIT编写翻译后的调用。在本例中,假定Employee的GetYearsEmployed方法再次回到5,。那么些平头就封存在有个别变量year中。如图4-11所示。

  图片 22

  9.
M3的下意气风发行代码调用Empolyee的底工例方法GenProgressReport。调用一个底牌例方法时,JIT编写翻译器要在点子中生成一些十三分轮代理公司码;方法每一趟调用时,都会推行那几个代码。那个代码首先检查发出调用的变量,然后跟随处址来到发出调用的对象。在本例中,变量e引用的是意味着”Joe”的一个Manager对象。然后,代码检核查象内出的”类型对象指针”成员,那一个成员指向对象的实在类型。然后,代码在档案的次序对象的办法表中找找援引了被调用方法的记录项,对艺术开展JIT编译(假若要求的话),再调用JIT编写翻译后的代码。在本例中,由于e援引了一个Manager对象,所以会调用Manager的GenProgressReport实现。如图4-12所示。

  图片 23

  总结:

  注意,在Employee和Manager类型对象都含有”类型对象指针”成员。那是由于体系对象本质也是指标。CLLX570创造项目对象时,必需发轫化这几个成员。初阶化成什么样吧?CL中华V初叶在一个历程中运作时,会立马为MSCOrLib.dll中定义的System.Type类型创立一个极度的体系对象。Employee和Manager类型对象都以该品种的”实例”.因而,它们的类型对象指针成员会开始化成对System.Type类型对象的援引。如图4-13。

  图片 24

  当然,System.Type类型对象自己也是八个对象,内部也许有叁个”类型对象指针”成员。那么那一个指针指向的是何许呢?它指向它本人,因为System.Type类型对象自作者正是叁个品种对象的”实例”。

  今后,大家到底掌握了CLR的上上下下项目系统会同专门的工作方法。System.Object的GetType方法重返的是累积在钦点对象的”类型对象指针”成员中的地址。也正是说,GetType方法再次来到的是指向目的的档案的次序对象的二个指南针。那样一来,就能够看清系统中别的对象(包涵项目对象自己)的诚实类型。

  

 

 

 

 

GetType

发表评论

电子邮件地址不会被公开。 必填项已用*标注