CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

C#值类型和装箱

Posted on 2010-04-17 12:25  Charles Chen  阅读(510)  评论(0编辑  收藏  举报

      今天闲逛C# Corner http://www.c-sharpcorner.com/网站(很有名气的),发现一篇不错的文章,图文并茂的方式讲解了C#的值类型以及值类型调用GetType时候,或者值类型被加入到ArrayList时候发生的装箱过程。这篇文章能帮助你对值类型的装箱过程,以及在通过引用如接口、委托或ArrayList来处理值类型时应注意些什么有更好的理解,这里记录下来和朋友们分享分享:

      当一个值类型实例被转换成System.Object类型或是接口时,CLR需要把值类型转换成一个恰当的引用类型。然后在托管堆上分配内存并将对象拷贝上去。我们之所以要了解它,有两个原因:装箱是一个非常耗费资源的过程(将整个对象从栈上拷贝到堆上会耗费处理器的周期以及托管空间),我们因此(装箱)而有了两个在内存可以有相互矛盾状态的对象。

      文章就不粘贴到这里了,这里加一个链接地址:方便作为查询及记录:

http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_boxing02122006144943PM/csharp_boxing.aspx

 

    需要特别注意一下:当调用ToString()方法时候,不总是发生装箱操作,它依赖于值类型的具体实现。加入那值类型重写了ToString()方法,编译器将直接调用那生成的IL代码而不用发生装箱操作。大多数的.Net的BCL(Base Class Libraries)或FCL(Framework Class Libraries)值类型,像Int32重写了ToString()方法,所以当

Int32 count=10;

string strcount=count.ToString();//没有进行装箱操作

而对于object.GetType()方法,它不是一个虚方法,所以值类型不能够提供任何实现,当调用GetType()将总是会发生装箱操作。

 

Best Regards,

Charles