Net复习笔记:第二章:IL看值类型和引用类型的一个区别

代码看值类型和引用类型的一个区别

    public class MyClass1

    {

    }

    public struct Mystruct

    {

   

    }

    public class ILDemo

    {

        MyClass1 Mc = new MyClass1();

        Mystruct Ms = new Mystruct();

    }

.method public hidebysig specialname rtspecialname

        instance void  .ctor() cil managed

{

  // 代码大小       31 (0x1f)

  .maxstack  8

  IL_0000:  ldarg.0

  IL_0001:  newobj     instance void NetNiBiXiuZhiDao.MyClass1::.ctor()

  IL_0006:  stfld      class NetNiBiXiuZhiDao.MyClass1 NetNiBiXiuZhiDao.ILDemo::Mc

  IL_000b:  ldarg.0

  IL_000c:  ldflda     valuetype NetNiBiXiuZhiDao.Mystruct NetNiBiXiuZhiDao.ILDemo::Ms

  IL_0011:  initobj    NetNiBiXiuZhiDao.Mystruct

  IL_0017:  ldarg.0

  IL_0018:  call       instance void [mscorlib]System.Object::.ctor()

  IL_001d:  nop

  IL_001e:  ret

} // end of method ILDemo::.ctor

可以看出:

引用类型初始化是:创建内存空间,引用构造函数初始化

IL_0001:  newobj     instance void NetNiBiXiuZhiDao.MyClass1::.ctor()

  IL_0006:  stfld      class NetNiBiXiuZhiDao.MyClass1 NetNiBiXiuZhiDao.ILDemo::Mc

  IL_000b:  ldarg.0

 

值类型是:找到内存空间中药创建的类型地址,然后对其进行初始化,也就是说值类型在编译期已经在栈上分配好了内存

IL_000c:  ldflda     valuetype NetNiBiXiuZhiDao.Mystruct NetNiBiXiuZhiDao.ILDemo::Ms

  IL_0011:  initobj    NetNiBiXiuZhiDao.Mystruct

  IL_0017:  ldarg.0

引用类型在初始化的时候会调用构造函数

IL_0001:  newobj     instance void NetNiBiXiuZhiDao.MyClass1::.ctor()

值类型不会调用构造函数而是直接将对象指控

initobj    NetNiBiXiuZhiDao.Mystruct

posted @ 2013-12-17 16:31  瀚海行舟  阅读(126)  评论(0)    收藏  举报