One method:try...catch...finally...
try
{
//Open the connection
conn.Open();
//Do something useful
}
catch(Exception ex)
{
//Do something about the exception
}
finally
{
//Ensure that the connection is freed
conn.close();
}
在finally块中,可以释放已经使用的任何资源。这种方式的惟一麻烦是必须确保关闭连接。很容易忘记在finally块中添加关闭连接的命令,所以应在编码风格上添加一些不容易出现反常情况的内容。
另外,在给定的方法中可能会打开许多资源(例如两个数据库连接和一个文件),这样try…catch…finally块的层次有时可能不容易看懂。但还有另一个方式可以确保资源的关闭—— 使用using语句。
the other method:
在开发C#的过程中,.NET在对象不再引用之后清理它们的方法是使用非决定性的析构方式,这已经引起了一个非常热烈的讨论。在C++中,对象只要使用完毕,就会自动调用其析构函数。这对于设计基于资源的类的人员来说,是一个非常好的消息,因为如果用户忘记关闭资源,使用析构函数是非常理想的。只要对象使用完毕,就会调用C++析构函数。所以,如果出现了异常,但没有捕获,有析构函数的所有对象就会调用它们的析构函数。
在C#和其他托管语言中,没有自动、决定性的析构方式,而是有一个垃圾收集器,它会在未来的某个时刻释放资源。它是非决定性的,因为我们不能确定这个过程在什么时候发生。忘记关闭数据库连接可能会导致.NET可执行程序的各种问题。幸运的是,我们还有解决的方法。下面的代码说明了如何使用using子句确保实现IDisposable接口的对象在退出块时立即被释放。
string source = "server=(local)//NetSDK;" +
" integrated security=SSPI;" +
"database=Northwind";
using ( SqlConnection conn = new SqlConnection ( source ) )
{
// Open the connection
conn.Open ( ) ;
// Do something useful
}
在这个示例中,无论块是如何退出的,using子句都会确保关闭数据库连接。