当前位置:  开发笔记 > 编程语言 > 正文

.net托管内存如何处理对象内的值类型?

如何解决《.net托管内存如何处理对象内的值类型?》经验,为你挑选了1个好方法。

类的值类型值必须与托管堆中的对象实例一起存在.方法的线程堆栈仅在方法的持续时间内存在; 如果该值仅存在于该堆栈中,该值如何保持不变?

托管堆中的类对象大小是其值类型字段,引用类型指针和其他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指令直接将该托管堆位置的值复制到线程堆栈中.这些类型的操作不会发生框/拆箱.



1> icelava..:

类的值类型值必须与托管堆中的对象实例一起存在.方法的线程堆栈仅在方法的持续时间内存在; 如果该值仅存在于该堆栈中,该值如何保持不变?

托管堆中的类对象大小是其值类型字段,引用类型指针和其他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指令直接将该托管堆位置的值复制到线程堆栈中.这些类型的操作不会发生框/拆箱.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有