谈谈.Net中struct与class

     谈这个问题之前,须清楚语言中两大数据类型:值类型和引用类型,当然仅从语言层面上来说可能已经非常清楚两者具体的范畴,比如说值类型包括简单数据类型

、结构体、和枚举;引用类型包括类、数组、接口、委托等,当然基础问题还是要搞清楚,但本文不会care这些概念上的描述,而从Element方面进行剖析。

     下面直接引用一些观点:

1. 值类型直接存储值,变量本身的内存空间存储其实际的数据;引用类型指向的内存空间保存的是值得内存引用,即实际数据的内存地址;

2. 内存分配原型上的差别,若要谈清楚这个问题,就需要对clr的不同的内存区域有清晰的认识:Thread Stack(线程堆栈)和 Managed Heap(托管堆)。shit很明显已经陷入了用一个

概念去解释另一个概念的怪圈,认识这个问题当然先要知道manged code 与unmanaged code(搞那么麻烦)。

简单来说,Managed Code(托管代码),是基于.Net Framework的,运行在framework内,这些Code能够直接被CLR执行,凡是在.Net Framework

框架内的任何语言code都是Managed Code。使用CLR的Managed Code能够通过内存管理、安全处理、跨语言调试等能够给应用程序提供一个良好的执行

环境。

有了这个概念之后对Unmanged code的理解也就清晰了,如果不是基于.Net Framework,而是在Framework之外开发的code都应该是unmanaged code了。

此类语言开发的应用程序不会受CLR的控制,因此也被称为不受托管的。像C++此类的语言就能够不受CLR控制的应用开发。

那么,针对程序运行时来说,每个Thread都会有自己的线程空间用于存储临时变量或者局部变量,大小大概为1M的存储空间,这块空间就被称作是线程堆栈。另外由CLR自行管理的成为“托管堆”。“线程堆栈”的分配与释放

无须主动干预,由线程自身进行相关堆栈的分配与free。而托管堆的分配则可以主动进行,最常见的方式是采用new关键字进行对象分配。

再回到最开始的数据类型的空间分配的问题,值类型的数据变量通常是在当前线程空间上进行的堆栈分配,

=下班了,回家写。=

 

 

 

 

posted @ 2014-07-03 17:29  !&eden  阅读(414)  评论(0)    收藏  举报