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

有时,代码要求非托管资源,如文件句柄、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的。。。using System;

    class C : IDisposable
    {
    public void UseLimitedResource()
    {
    Console.WriteLine("Using limited resource...");
    }

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

    class Program
    {
    static void Main()
    {
    using (C c = new C())
    {
    c.UseLimitedResource();
    }
    Console.WriteLine("Now outside using statement.");
    Console.ReadLine();
    }
    }


     

    posted @ 2009-08-27 11:56  elite_lcf  阅读(2708)  评论(0编辑  收藏  举报
    知识共享许可协议
    本博客采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。