在开发C#的过程中,.NET在对象不再引用之后,清理它们的方法是使用非析构方式。
在C++中,对象只要使用完毕,就会自动调用其析构函数。这对于基于资源的类的设计人员是非常好的消息,因为如果用户忘记关闭资源,则最好使用析构函数。只要对象使用完毕,就会调用C++析构函数。所以,例如,如果出现了异常,但没有捕获,有析构函数的对象就会调用它们的析构函数。
在C#和其它托管语言中,没有自动的、决定性的析构的概念,面是有一个垃圾回收器,它会在未来的某个时刻释放资源。它是非决定性的,国为我们不能确定这个过程在什么时候发生。如,忘记关闭数据库连接可能会导致.NET可执行程序的各种问题。幸运的是,我们还有解决办法。下面的代码说明了如何使用Using语句块确保在退出块后立即释放实现IDisposable接口的对象。
String connectionstring=”server=(local);integrated security=SSPI;database=Northwind”;
Using(SqlConnection conn=new SqlConnection(connectionstring))
{
//打开连接
Conn.Open;
//执行某些代码
}
在这个实例中,无论块是,using语句块都会确保关闭数据库连接。
查看连接类的Dispose()方法的IL代码,它们都检查连接对象的当前状态,如果其状态为打开,就调用Close()方法。
在编程时,无论在哪里获得资源,最好都使用using()语句块,因为尽管我们都打算编写释放资源的语句,但有时会忘记,并且出现异常时using子句就会发挥作用。