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