C#语言中的Using语句块确保资源被释放
2017-10-10 11:46
381 查看
在开发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子句就会发挥作用。
在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子句就会发挥作用。
相关文章推荐
- 提高C#编程水平的50个要点 之十五“使用 using 和 try-finally 来处理资源的释放”
- c#:使用using关键字自动释放资源未必一定就会有明显好处
- using – 再谈.Net Framework(C#/VB.Net)的资源释放
- c#:使用using关键字自动释放资源未必一定就会有明显好处(转)
- c#对于如何释放资源的解释,又让我对此语言有更进一步的理解
- C#利用using和try-finally来释放资源
- 【.Net码农】c#:使用using关键字自动释放资源未必一定就会有明显好处
- c#:使用using关键字自动释放资源未必一定就会有明显好处
- C# 中using 用来释放资源的用法
- C#中using关键字在资源释放中的使用
- java中的可释放资源定义,类似c#中的using
- C#里using的妙用(释放资源)
- c#事务、using释放资源、实体类的高级应用
- using在C#中使用用于资源的释放
- C# 资源释放
- 浅谈C#托管程序中的资源释放问题
- C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案
- C# 关于类资源的释放
- C#中释放数据库连接资源
- 《Effective C#》Item 15:利用using和try-finally来释放资源