其实我的关注点是哪些需要手动的去释放资源。
包括:比如文件流、图像图形类、数据库的连接,网络连接,系统的窗口句柄,打印机资源等,这类资源一般不存在堆上。可以认为操作系统资源的一组API。具体可以参考MSDN
我的理解是主要有两种情况:
一、这些需要手动释放资源的变量出现在类的方法里,当方法结束的时候需要去手动或显示的释放这些资源。比如下边代码,通过用using 显示释放资源
using(SqlConnection conn = new SqlConnection())
{
//do something;
}
c#使用using简化输入,编译器自动翻译成 try...finally,等同于下面写法
SqlConnection conn = new SqlConnection();
try
{
//do something;
}
finally
{
conn.Dispose();
}
使用using要求后边的实例必须实现IDisposable接口
二、这些需要手动释放资源的变量出现在类的字段里,这时候需要让这个类实现IDisposable接口,程序别的地方用到这个类实例的时候,就可以通过调用实例的Dispose()来显示的释放资源
标准清理模式,代码如下:
MyClass:IDisposable
{
private bool disposed = false;
~MyClass()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if(disposed == false)
{
if(disposing == true)
{
// 释托管代码
......
}
// 释非代码
......
}
disposed = true;
}
}