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

浙公网安备 33010602011771号