C#中using语句的作用

本文详细解析了C#中的using语句及其与IDisposable接口的结合使用,阐述了如何确保非托管资源的正确释放,包括语法、作用、实现方式以及垃圾回收机制。此外,还介绍了如何利用try-finally模式与using语句来管理资源,确保程序健壮性和资源高效利用。
摘要由CSDN通过智能技术生成

在petshop中对数据库操作时用到了类似这样的语句:

using(OracleConnection conn = new OracleConnection(connString))  {  }

不是很理解,于是对该using语句的用法及相关概念在MSDN中查了查,归纳如下:

1、using语句: 用于定义一个范围,在此范围的末尾将释放对象。提供能确保正确使用IDisposable 对象的方便语法。

2、语法

有许多其他类别的非托管资源和封装这些资源的类库类型。所有这些类型都必须实现 IDisposable 接口。

按照规则,当使用 IDisposable 对象时,应在 using 语句中声明和实例化此对象。using 语句按照正确的方式调用对象上的 Dispose 方法,并(在您按照前面所示方式使用它时)会导致在调用 Dispose 时对象自身处于范围之外。在 using 块中,对象是只读的并且无法进行修改或重新分配。

using语句确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。通过将对象放入 try 块中,并在调用 finally 块中的 Dispose,可以获得相同的结果;实际上,这就是编译器转换 using 语句的方式。(请注意,使用额外的大括号为对象创建有限范围)

可以将多个对象与 using 语句一起使用,但必须在 using 语句中声明这些对象。若先实例化再传递到using语句中,即使离开using块访问该对象也会出现异常,所以通常最好是在 using 语句中实例化该对象并将其范围限制在 using 块中。

3、IDisposable接口:定义一种释放分配的资源的方法。

此接口的主要用途是释放非托管资源。当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。但无法预测进行垃圾回收的时间。另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。

将此接口的 Dispose方法与垃圾回收器一起使用来显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。

向现有类添加 IDisposable 接口是重大的更改,因为这更改了类的语义。

在调用可实现 IDisposable 接口的类时,请使用try/finally 模式来确保非托管资源能够释放出来,即使应用程序因出现异常而中断也是如此。请注意,您可以使用 using 语句(在 Visual Basic 中为 Using)来代替 try/finally 模式。

4、try-finally: finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给 finally 块,与 try 块的退出方式无关。

5、实现 Dispose 方法:类型的 Dispose 方法应释放它拥有的所有资源。它还应该通过调用其父类型的Dispose 方法释放其基类型拥有的所有资源。该父类型的 Dispose 方法应该释放它拥有的所有资源并同样也调用其父类型的Dispose 方法,从而在整个基类型层次结构中传播此模式。若要确保始终正确地清理资源,Dispose 方法应该可以被多次调用而不引发任何异常。

6、实现 Close 方法

对于类型来说,若调用 Close 方法比调用Dispose 方法更容易,则可以向基类型添加一个公共 Close 方法。Close 方法又会调用没有参数的 Dispose 方法,该方法可以执行正确的清理操作。下面的代码示例阐释了Close 方法。

7、垃圾回收:.NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次您使用 new运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

8、强制回收:在大多数情况下,垃圾回收器可以确定执行回收的最佳时间,应让其独立运行。在某些不常发生的情况下,强制回收可以提高应用程序的性能。在这些情况下,可使用 Collect 方法强制垃圾回收,以引发垃圾回收。

当应用程序代码中某个确定的点上使用的内存量大量减少时,请使用 Collect 方法。例如,如果应用程序使用包含若干个控件的复杂对话框,则在对话框关闭时调用 Collect 可能会通过立即回收内存来提高性能。务必确保应用程序不会过于频繁地引发垃圾回收,否则当垃圾回收器无效率地尝试回收对象时,可能会使性能降低。Optimized 模式使垃圾回收器可以根据收集是否有效率来确定是否进行回收。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值