1.托管代码 (Managed code)
由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
2.非托管代码(Unmanaged Code)
在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务
非托管资源是你通过P/Invoke之类方法得到的os资源
3.为何要实现IDisposeable
.NET 类库使用的非托管资源她自己已经处理好了,而自己写的程序中使用了非托管资源,有些内容占用空间很大,长期运行会影响程序运行,.net自己的GC会不时的自己清理,但这时,我们需要手动清理.所以必须写了.
.net 的finalize()方法(~ClassName())也可以处理释放非托管资源,但是不知什么时候去释放.
4.实现IDisposable接口的类
- class Test:IDisposable
- {
- public void Dispose()
- {
- Console.WriteLine("释放资源"):
- }
- }
5.微软推荐的.实现IDisposable接口的类
public class MyResourceHog : IDisposable
{
// 已经被处理过的标记
private bool _alreadyDisposed = false;
// 终结器。调用虚拟的Dispose方法
~MyResourceHog()
{
Dispose( false );
}
// IDisposable的实现
// 调用虚拟的Dispose方法。禁止Finalization(终结操作)
public void Dispose()
{
Dispose( true );
GC.SuppressFinalize( true );
}
// 虚拟的Dispose方法
protected virtual void Dispose( bool isDisposing )
{
// 不要多次处理
if ( _alreadyDisposed )
return;
if ( isDisposing )
{
// TODO: 此处释放受控资源
}
// TODO: 此处释放非受控资源。设置被处理过标记
_alreadyDisposed = true;
}
}