它完全是新对象的产生

时间:2022-04-11 01:23:59

理解堆与栈对付理解.NET中的内存打点、垃圾回收、错误和异常、调试与日志有很大的辅佐。垃圾回收的机制使措施员从庞大的内存打点中解脱出来,虽然绝大大都的C#措施并不需要措施员手动打点内存,但这并不代表措施员就无需了解分配的东西是如何被回收的,,在一些特殊的场合仍需要措施员手动进行内存打点。

在32位的措置惩罚惩罚器上,每个进程的虚拟内存为4GB,.NET会在这4GB的内存块中斥地出3块内存,分袂作为栈、托管堆、和非托管堆

堆(heap):

堆是从下往上分配,所以已用的空间在*空间下面,C#中所有引用类型的东西分配在托管堆上,托管堆在内存上是持续分配的,并且内存东西的释放受垃圾收集机制的打点,效率相对付栈来说要低的多。

栈(stack):

栈是自上向下进行填充,即由高内存地点指向低内存地点,并且内存分配是持续的,C#中所有的值类型和引用类型的引用都分配在栈上,栈按照后进先出的原则,依次对分配和释放内存东西。

东西内存的分配与销毁:

当一个类的实例东西创建的时候,这个东西的差别成员按类别被分配到了差此外内存区域,值类型和引用类型的指针被分配到了栈上,引用类型的实例东西被分配到了托管堆上,静态成员被分配到了全局数据区。此时栈上的指针会指向堆上的东西。当东西使用完以后,引用和实际东西的联系就会断开,从而从而使东西蛰伏。因为栈具有自我维护性,它的内存打点可以通过操纵系统来完成,而此时堆上的蛰伏东西就需要通过垃圾回收器(GC)使用必然的算法来进行回收,释放东西所占据的内存。

C#中的深拷贝与浅拷贝

深拷贝:又称深度克隆,它完全是新东西的孕育产生,不只复制所有的非静态值类型成员,而且复制所有引用类型成员的实际东西。(即栈上和堆上的成员均进行复制

浅拷贝:又称影子克隆,只复制原始东西中的所有的非静态的值类型成员和所有引用类型成员的引用,就是说,原始东西和新东西共享所有引用类型成员的东西实例。(即只复制栈上的成员)

:不管是深拷贝还是浅拷贝,都不会复制全局数据区的成员,因为全局数据区的成员是静态成员,它属于某一个类,并不属于类的实例东西,因此无法复制。

C#中的深拷贝可以通过实现ICloneable接口来实现,但是在不是必需实现ICloneable接口的情况下,应制止类型担任ICloneable接口。因为这样做将强制所有的子类必需实现ICloneable接口,否则子类的新成员将不能被类型的深拷贝所笼罩。