风云资源站

c#的using语句块的解释和使用

之前偶有机会看到 MSDN 论坛上有人提到关于使用 using 语句的错误观念 (看到不止一次),由于自己也经常在用,不知道原来有人会误以为使用 using 会将所有例外状况 (Exception) 给吃掉,但事实上并非如此,请让我娓娓道来。

using 有两种,相信许多人经常会用到:

  1. 一种是作为「指示词」,可用来建立命名空间的别名(Alias),或用来汇入在其他命名空间中定义的型别
    2. 另一种是「语句」,可用来定义一个范围,该范围内的对象会在此范围结尾处执行 Dispose 方法。

第一种:using 指示词

标准用法:

using System.Text;

别名用法:

using Models = MvcApplication.Models;

第二种:using 语句 ( 也是我今天想强调的部分 )

using 语句是一个非常基本的 C# 语法,相信在实务开发上经常会使用到,如果没使用过的人可能代表你对 .NET 的内存管理的 Sense 不太够,很有可能写出资源耗尽的 .NET 程序代码。

虽然 .NET 有内建强大的内存管理机制(GC),但开发人员还是不能完全依赖 .NET 来处理一些无法释放的资源,例如:Handles, Unmanaged Resources, …。

而使用 using 最主要的目的是为了让对象建立的同时能确保该对象所占用的资源一定会被完整释放,如果没有释放这些无法自动释放的资源,就很有可能让 .NET 应用程序发生 资源耗尽 (Resource Exhausted) 的状况。

从 MSDN 上节录一段范例程序如下:

using (System.IO.StreamReader sr =

         new System.IO.StreamReader(@”C:\test.txt”))

{

    string s = null;

    while((s = sr.ReadLine()) != null)

    {

        Console.WriteLine(s);

    }

}

使用 using 语句有一个最基本的条件,就是该对象必须有实做 IDisposable 接口,才能确保在 using 的结尾数时自动执行 Dispose() 方法

使用 using 语句的另一个强烈建议的条件,就是该对象被建立的语法必须写在 using 子句中,否则对象很有可能在被释放后还有其他对象存取的情况,进而引发例外状况!

有些人认为 using 语句会自动被翻译成以下程序代码:(错误范例)

{
    System.IO.StreamReader sr = new System.IO.StreamReader(@”C:\test.txt”);
    try
    {
      string s = null;
      while((s = sr.ReadLine()) != null)
      {
          Console.WriteLine(s);
      }
    }
    catch
    {
    }
    finally
    {
      if (sr != null)
        ((IDisposable)sr).Dispose();
    }
}

但事实上,应该不包含 catch 的区段才是!正确的语法应该如下:

{

        System.IO.StreamReader sr = new System.IO.StreamReader(@”C:\test.txt”);

        try

        {

          string s = null;

          while((s = sr.ReadLine()) != null)

          {

                  Console.WriteLine(s);

          }

        }

        finally

        {

          if (sr != null)

               ((IDisposable)sr).Dispose();

        }

}

也就是在使用 using 语句时,虽然有 tryfinally,但并不包含 catch 的成分!

换句话说,使用 using 语句并不会帮你捕捉例外状况!!

所以就算你用 using 在程序中,若要处理 try-catch 的状况还是要自行撰写,否则就会遇到非预期的例外状况而导致应用程序挂掉,这点必须特别注意!

 

以上内容援引自:https://blog.miniasp.com/post/2009/10/12/About-CSharp-using-Statement-misunderstanding-on-try-catch-finally.aspx