类的值类型值必须与托管堆中的对象实例一起存在.方法的线程堆栈仅在方法的持续时间内存在; 如果该值仅存在于该堆栈中,该值如何保持不变?
托管堆中的类对象大小是其值类型字段,引用类型指针和其他CLR开销变量(如同步块索引)的总和.当一个值为对象的value-type字段赋值时,CLR将该值复制到该特定元素字段的对象内分配的空间.
举个例子,一个带有单个字段的简单类.
public class EmbeddedValues { public int NumberField; }
有了它,一个简单的测试类.
public class EmbeddedTest { public void TestEmbeddedValues() { EmbeddedValues valueContainer = new EmbeddedValues(); valueContainer.NumberField = 20; int publicField = valueContainer.NumberField; } }
如果您使用.NET Framework SDK提供的MSIL反汇编程序来查看EmbeddedTest.TestEmbeddedValues()的IL代码
.method public hidebysig instance void TestEmbeddedValues() cil managed { // Code size 23 (0x17) .maxstack 2 .locals init ([0] class soapextensions.EmbeddedValues valueContainer, [1] int32 publicField) IL_0000: nop IL_0001: newobj instance void soapextensions.EmbeddedValues::.ctor() IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: ldc.i4.s 20 IL_000a: stfld int32 soapextensions.EmbeddedValues::NumberField IL_000f: ldloc.0 IL_0010: ldfld int32 soapextensions.EmbeddedValues::NumberField IL_0015: stloc.1 IL_0016: ret } // end of method EmbeddedTest::TestEmbeddedValues
请注意,CLR被告知将堆栈中加载的值"20" stfld加载到加载的EmbeddValues的NumberField字段位置,直接进入托管堆.类似地,在检索值时,它使用ldfld指令直接将该托管堆位置的值复制到线程堆栈中.这些类型的操作不会发生框/拆箱.
类的值类型值必须与托管堆中的对象实例一起存在.方法的线程堆栈仅在方法的持续时间内存在; 如果该值仅存在于该堆栈中,该值如何保持不变?
托管堆中的类对象大小是其值类型字段,引用类型指针和其他CLR开销变量(如同步块索引)的总和.当一个值为对象的value-type字段赋值时,CLR将该值复制到该特定元素字段的对象内分配的空间.
举个例子,一个带有单个字段的简单类.
public class EmbeddedValues { public int NumberField; }
有了它,一个简单的测试类.
public class EmbeddedTest { public void TestEmbeddedValues() { EmbeddedValues valueContainer = new EmbeddedValues(); valueContainer.NumberField = 20; int publicField = valueContainer.NumberField; } }
如果您使用.NET Framework SDK提供的MSIL反汇编程序来查看EmbeddedTest.TestEmbeddedValues()的IL代码
.method public hidebysig instance void TestEmbeddedValues() cil managed { // Code size 23 (0x17) .maxstack 2 .locals init ([0] class soapextensions.EmbeddedValues valueContainer, [1] int32 publicField) IL_0000: nop IL_0001: newobj instance void soapextensions.EmbeddedValues::.ctor() IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: ldc.i4.s 20 IL_000a: stfld int32 soapextensions.EmbeddedValues::NumberField IL_000f: ldloc.0 IL_0010: ldfld int32 soapextensions.EmbeddedValues::NumberField IL_0015: stloc.1 IL_0016: ret } // end of method EmbeddedTest::TestEmbeddedValues
请注意,CLR被告知将堆栈中加载的值"20" stfld加载到加载的EmbeddValues的NumberField字段位置,直接进入托管堆.类似地,在检索值时,它使用ldfld指令直接将该托管堆位置的值复制到线程堆栈中.这些类型的操作不会发生框/拆箱.