使用非托管资源的类型必须实现IDisposable接口的Dispose()方法来精确的 释放系统资源。.Net环境的这一规则使得释放资源代码的职责是类型的使用者, 而不是类型或系统。因此,任何时候你在使用一个有Dispose()方法的类型时, 你就有责任来调用Dispose()方法来释放资源。最好的方法来保证Dispose()被调 用的结构是使用using语句或者try/finally块。
所有包含非托管资源的 类型应该实现IDisposable接口,另外,当你忘记恰当的处理这些类型时,它们 会被动的创建析构函数。如果你忘记处理这些对象,那些非内存资源会在晚些时 候,析构函数被确切调用时得到释放。这就使得这些对象在内存时待的时间更长 ,从而会使你的应用程序会因系统资源占用太多而速度下降。
幸运的是 ,C#语言的设计者精确的释放资源是一个常见的任务。他们添加了一个关键字 来使这变得简单了。
假设你写了下面的代码:
public void ExecuteCommand( string connString,
string commandString )
{
SqlConnection myConnection = new SqlConnection( connString );
SqlCommand mySqlCommand = new SqlCommand( commandString,
myConnection );
myConnection.Open();
mySqlCommand.ExecuteNonQuery();
}
这个例子中的两 个可处理对象没有被恰当的释放:SqlConnection和SqlCommand。两个对象同时 保存在内存里直到析构函数被调用。(这两个类都是从 System.ComponentModel.Component继承来的。)
解决这个问题的方法就 是在使用完命令和链接后就调用它们的Dispose:
public void ExecuteCommand( string connString,
string commandString )
{
SqlConnection myConnection = new SqlConnection( connString );
SqlCommand mySqlCommand = new SqlCommand( commandString,
myConnection );
myConnection.Open();
mySqlCommand.ExecuteNonQuery();
mySqlCommand.Dispose( );
myConnection.Dispose( );
}
这很好,除非SQL命令在执 行时抛出异常,这时你的Dispose()调用就永远不会成功。using语句可以确保 Dispose()方法被调用。当你把对象分配到using语句内时,C#的编译器就把这 些对象放到一个try/finally块内:
public void ExecuteCommand( string connString,
string commandString )
{
using ( SqlConnection myConnection = new
SqlConnection( connString ))
{
using ( SqlCommand mySqlCommand = new
SqlCommand( commandString,
myConnection ))
{
myConnection.Open();
mySqlCommand.ExecuteNonQuery();
}
}
}