我的 using语句之-释放资源和异常处理

本文详细介绍了C#中Using语句的使用方法及其背后的原理。Using语句用于确保非托管资源的正确释放,避免内存泄漏。文章通过实例演示了如何创建实现了IDisposable接口的对象,并在使用完毕后通过Using语句释放资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时,代码要求非托管资源,如文件句柄、COM 包装或 SQL 连接。在使用一个或多个此类资源完成了代码后,Using 块确保这些资源的释放。这样,其他代码就可以使用它们。
托管资源由 .NET Framework 垃圾回收器 (GC) 释放,您不需要进行任何额外的编码。您也不需要用于托管资源的 Using 块。
Using 块有三个部分:获取、使用和释放。
  • 获取表示创建变量并将其初始化,以便引用系统资源。Using 语句可获取一个或多个资源,您可以在进入块之前恰好获取一个资源,并将其提供给 Using 语句。如果提供 resourceexpression,在将控制权传递给 Using 语句之前,您必须获取资源。
  • 使用表示访问资源并使用资源执行操作。Using 和 End Using 之间的语句代表资源的使用过程。
  • 释放表示针对 resourcename 中的对象调用 Dispose 方法。这使该对象可以完全终止其非托管资源。End Using 语句释放 Using 块控制的资源。

行为Using 块的工作方式类似于 Try...Finally 构造,在该构造中,Try 块使用资源,而 Finally 块释放资源。因此,不管您如何退出块,Using块都可确保资源的释放。即使发生未处理的异常(除 StackOverflowException 外),也是如此。
Using 语句获取的每个资源变量的范围仅限于 Using 块。
如果在 Using 语句中指定多个系统资源,效果就好像您将多个 Using 块相互嵌套一样。

Using 块中的结构化异常处理如果需要处理可能发生在 Using 块中的异常,可以向该块中添加一个完整的 Try...Finally 构造。如果需要处理Using 语句未成功获取资源的情况,可以进行测试,以确定 resourcename 是否为 Nothing

进行结构化异常处理而不使用 Using 块如果需要对资源的获取进行更细致的控制,或者需要 Finally 块中的附加代码,可以将 Using 块重写为Try...Finally 构造。下面的示例显示主干 Try 和 Using 构造,这两个构造在获取和释放 resource 过程中是等效的。

   在using语句内的资源必须重载IDispose这个接口,上面说的可以看出,using只负责执行所包含资源的一些操作,然后释放掉,并不是能够处理(using(){。。。。})大括号里的异常,如果担心内部发生异常,是要自己写try和catch的。。。

    保险的写法是 Try……catch……finally……;但是哪些的内部异常是可能会出现的呢? 有待解决。

 

using 的写法

ContractedBlock.gifExpandedBlockStart.gifCode
using System;

class C : IDisposable
ExpandedBlockStart.gifContractedBlock.gif
{
    
public void UseLimitedResource()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        Console.WriteLine(
"Using limited resource");
    }


    
void IDisposable.Dispose()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        Console.WriteLine(
"Disposing limited resource.");
    }

}


class Program
ExpandedBlockStart.gifContractedBlock.gif
{
    
static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
using (C c = new C())
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            c.UseLimitedResource();
        }

        Console.WriteLine(
"Now outside using statement.");
        Console.ReadLine();
    }

}

 

 

转载于:https://www.cnblogs.com/Steven7Gao/archive/2009/10/27/1590496.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值