托管、非托管
为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码叫"非托管代码". 事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
非托管代码,如包装操作系统资源的一类对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器(GC)可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。
内存分配
值数据类型存储在栈(Stack)中,指针变量和函数传递的参数也都是值数据类型,存储在栈中;引用类数据对象存储在堆(Heap)中。
栈中的数据释放遵循后进先出的准则,即后申明的变量先结束作用域,变量的生存期必须嵌套。
引用类数据存储在堆中,而引用变量还是存储在栈中,并且栈中可以有多个变量引用堆中的引用数据。当栈中的某个引用变量超出作用域时,引用数据并不一定会释放,只有当栈中对其引用的变量全部超出作用域,并等待垃圾回收器删除它或程序终止时,引用数据才能被释放。
Dispose
这是实现 Dispose 模式的常规模式重写 Object.Finalize的基类:
using System; class BaseClass : IDisposable { // Flag: Has Dispose already been called? bool disposed = false; // Public implementation of Dispose pattern callable by consumers. public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } // Protected implementation of Dispose pattern. protected virtual void Dispose(bool disposing) { if (disposed) return; if (disposing) { // Free any other managed objects here. // } // Free any unmanaged objects here. // disposed = true; } ~BaseClass() { Dispose(false); } } |