C#编程中的内存管理不该忽略的问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C#编程中的内存管理不该忽略的问题   摘要:本文重点就C#编程中的内存管理进行介绍,并就C#编程的内存管理中不可以忽视的一些问题进行了分析。   关键词:C#编程;内存管理;问题   中图分类号:TP312.1 文献标识码:A文章编号:1007-9599 (2011) 13-0000-02   C# Programming in the Memory Management Problems Should Not Be Ignored   Han Yaotang   (China AviationClearing Co.Ltd.,Beijing100122,China)   Abstract:This article focuses on C# programming in the memory management introduced,and the C# programming memory management can not ignore some of the problems were analyzed.   Keywords: C# programming;Memory management;Issues   C#通常将数据分成两种类型,即值数据以及引用数据两种类型,此两种类型通常存储于内存的不同的部位:值数据类型通常存储于堆栈之中,而引用类型则存储于内存的托管堆内。   一、内存管理相关内容概述   通常来说,Windows所使用的为虚拟的寻址系统,此系统的功能是将程序中可以使用的内存地址映射于内存中实际的地址上。硬件内存内各个存储单元均从零开始并向上进行存储的,因此,要想对存储于内存中的某一个空间的值进行访问,就必须对表示此存储单元地址进行提供。在相对较高级的编程语言下,编译器其中的一个相当重要的作用即负责把可理解的变量名称转变成处理器可理解的相应的内存地址。   (一)堆栈   内存中有一个区域名为堆栈,存储对象成员中,值数据类型进行方法的调用时都传递到所有方法的参数副本,进行方法的调用过程中,堆栈所存储的其实为所有参数的副本,因而将值类型A传递给函数时,A值通常不发生变化。但是引用类型却是变化的,这是由于堆栈中所以存储的为引用类型的地址,这个将在下文介绍。以一例子对堆栈工作的方式进行说明,如下代码所示:   {   int a;   {   intb;   }   }   先声明a,内部代码块中声明b,后内部代码块终止,b即出作用域,然后a即出了作用域。因此,b其生命周期总包含于a的生命周期之中,进行变量的释放时,其顺序总同分配内存顺序保持相反。即变量的生存周期均为嵌套式。此即为堆栈工作的方式。   (二)托管堆   堆栈的性能相当的高,但由于变量的生命周期要求必须为嵌套,因而有时候会显得过于苛刻。因而人们寄希望于另一种方法进行内存的分配,进行某些数据的存储并确保方法退出相当长的一段时间内,此类数据仍可用。鉴于此,托管堆即出现了。托管堆,简称为堆,其指的是内存中的另一个区域,通过另一个例子对堆的工作方式进行说明,如下代码所示:   {   Customer customer1;   customerl=new Customer();   Customer customer2=new Customer   ();   }   先声明一个Customer为customer1,并在堆栈上对此进行分配存储控件的引用。这里仅对此进行分配存储空间的引用,并非实际Customer的对象。而通过customerl所占用的4个字节的空间对Customer对象于内存中的具体地址进行了表示。然后进行第二行代码的执行并完成以下的操作过程:在堆上进行存储空间的分配用来进行Customer对象的存储,此处为Customer对象。把变量customer1的值设置成分配给Customer对象的内存地址,从此例可看出,进行引用类型的变量的建设过程较比值类型变量的建设过程要复杂的多,且无法避免的会出现性能降低的情况。但可将一个引用变量的值赋予另一引用变量,当其中一个变量出了作用域的时候,其在堆栈中会删除,但对象的数据依然存储于内存之中直至程序停止为止。此时当将一引用变量A传递给函数的时候,只是将此变量A的引用传给了函数,也就是说只是在堆栈上进行了内存的分配,也就是变量B二者指向了相同的一个内存地址。因而一旦变量B有变化发生时,变量A也跟着发生改变。   (三)装箱以及拆箱   装箱与拆箱指的是值类型以及引用类型项目的转化,装箱是值类型向引用类型的转换的一个途径,而拆箱则刚好相反,将引用类型向值类型进行转换。   (四)垃圾的收集   通常来说,NET运行库会在需要的时候进行

文档评论(0)

heroliuguan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8073070133000003

1亿VIP精品文档

相关文档