比如Employee e;
clr都干了些什么? 有没有初始化Employee这个类型对象?我想了解下底层的工作原理

解决方案 »

  1.   

    Employee e;这样子CLR不做任何事,你把EXE DLL 可以反编成IL语言,像返编出来的方法体内是空的
      

  2.   


    Employee类型对象也没初始化? 那它有什么作用? 只是规定能对这个类型进行什么操作?
      

  3.   


    Employee类型对象也没初始化? 那它有什么作用? 只是规定能对这个类型进行什么操作?请百度啥叫初始化。,都说了只要不引用这个变量,最终会被编译器丢掉
      

  4.   

    就算是规定,那么给谁规定?关CLR任何事吗?你要搞清楚对象,这是先决条件。如果你一味地满脑子CLR,而不知道自己缺乏编译技术基础(你稍微知道一下编译过程需要进行几趟扫描、每一次都要获得基本的什么数据结构),那么就很难说明白了。
      

  5.   

    先搞清楚,声明变量的目的是告诉编译器,你需要为这个变量在符号表中创建一个项,并且将它和对这个变量的访问关联在一起。对于CLR来说,根本没有“变量”这么回事。
      

  6.   

    那如果我给它一个值呢
    Employee e = new Manager();
    class Manager:Employee 
    {
    }
      

  7.   

    那如果我给它一个值呢
    Employee e = new Manager();
    class Manager:Employee 
    {
    }

    给值了就不一样了呀。
      

  8.   

    那如果我给它一个值呢
    Employee e = new Manager();
    class Manager:Employee 
    {
    }

    无论你怎么定义,都不关clr什么事。
      

  9.   

    那如果我这样问, Employee e = new Manager();
    CLR对变量e做了什么?还请大神耐心回答下下
      

  10.   

    那如果我这样问, Employee e = new Manager();
    CLR对变量e做了什么?还请大神耐心回答下下
    CLR调用Manager的构造函数(.ctor)创建一个Manager的实例。
    并且把它放入计算栈(eval stack)的顶端。
      

  11.   

    你说的这种情况应该是没有对e进行任何操作吧? 那如果对e还有后续操作呢? 这下应该要为e分配内存并且返回实例对象的内存地址了吧?
      

  12.   

    Employee e = new Manager();
    相当于
    Employee e;
    e = new Manager();
    怎么叫“应该是没有对e进行任何操作”。只要你调用构造函数,CLR自然会分配内存。和“进行任何操作”没有关系。
      

  13.   

    那我就不理解'至于“e”这个变量名,已经不存在了。'是什么意思了?目标代码直接使用地址(或者对于托管程序,是一个类似id的东西,也就是我们说的引用),相同的地址就是一个变量,而变量名是什么,CLR不知道也不关心。如果你试图反编译回来,这个变量名可以是e,也可以是任何一个名字,这个无关紧要。
      

  14.   

    如果我没记错的话,编译器先把你的代码翻译成 CIL common intermedia language,而不是翻译成二进制代码
    这些CIL 按照类,命名空间等组织结构存储在assembly中
    当程序运行时,CLR commen language runtime 再把CIL 翻译成二进制代码所以LZ,你所说的定义一个类型,根本跟CLR 没有任何关系,在运行时,CLR可能会跟你的定义有关系,但已经不是你自己的c#语言了,是一种CIL就像JAVA 虚拟机原理一样,C#本来就是运行在这种虚拟机制上的
      

  15.   

    那我就不理解'至于“e”这个变量名,已经不存在了。'是什么意思了?目标代码直接使用地址(或者对于托管程序,是一个类似id的东西,也就是我们说的引用),相同的地址就是一个变量,而变量名是什么,CLR不知道也不关心。如果你试图反编译回来,这个变量名可以是e,也可以是任何一个名字,这个无关紧要。恩。