using的三种用法

1.using作为指令。using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的。

2.using创建别名。using + 别名 = 包括详细命名空间信息的具体的类型。

3.作为语句,用于定义一个范围,在此范围的末尾将释放对象。

场景:
当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。
要达到这样的目的,用try...catch来捕捉异常也是可以的,但用using也很方便。

    在 using 语句中创建一个实例,确保退出 using 语句时在对象上调用 Dispose。当到达 using 语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句。

   实例化的对象必须实现 System.IDisposable 接口。

可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳做法。在这种情况下,该对象将在控制权离开 using 块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。换句话说,再也不能完全初始化该对象。如果试图在 using 块外部使用该对象,则可能导致引发异常。由于这个原因,通常最好是在 using 语句中实例化该对象并将其范围限制在 using 块中。

Example:

  1. using System;   //using 引用命名空间   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using System.IO;   
  5. using System.Data;   
  6. using System.Data.SqlClient;   
  7. using System.Xml;   
  8. using Excel = Microsoft.Office.Interop.Excel; //using 创建别名   
  9.   
  10. namespace statement   
  11. {   
  12.     //指定Font类的别名为F   
  13.     using F = System.Drawing.Font;   
  14.   
  15.     class Program   
  16.     {   
  17.         static void Main(string[] args)   
  18.         {   
  19.             //using 强制资源清理   
  20.             using (TextWriter writer = File.CreateText(@"E:/test.txt"))   
  21.             {   
  22.                 //使用别名来实例化对象   
  23.                 F font = new F("宋体", 12);   
  24.                 writer.WriteLine(font.Name.ToString() + font.Size.ToString());   
  25.             }   
  26.   
  27.   
  28.             //上面的using语句等价于   
  29.             TextWriter w = File.CreateText(@"E:/test.txt");   
  30.             try  
  31.             {   
  32.                 F font = new F("宋体", 12);   
  33.                 w.WriteLine(font.Name.ToString() + font.Size.ToString());   
  34.             }   
  35.             finally  
  36.             {   
  37.                 if (w != null) w.Dispose();   
  38.             }   
  39.   
  40.   
  41.             //也可以在using之前声明对象   ,NOT Recommended.
  42.             TextReader r = File.OpenText("E://test.txt");   
  43.             using (r)   
  44.             {   
  45.                 Console.WriteLine(r.ReadToEnd());   
  46.             }   
  47.   
  48.   
  49.             //对象类型相同时,可以使用多个:   
  50.             using (StreamReader reader = new StreamReader("1.txt"), reader2 = new StreamReader("2.txt"))   
  51.             {   
  52.                 //do something   
  53.             }   
  54.   
  55.   
  56.             //嵌套using   
  57.             using (SqlConnection conn = new SqlConnection())   
  58.             {   
  59.                 using (SqlCommand cmd = new SqlCommand())   
  60.                 {   
  61.                     //嵌套using 缩进太多,从而不便于观察代码,可以用,但适可而止,如果有多层嵌套请使用 多重using   
  62.                     //这一层如果出错,不会影响上一层conn的释放,也就是说可以这么用   
  63.                 }   
  64.             }   
  65.   
  66.   
  67.             //多重using   
  68.             using (StreamReader reader = new StreamReader("1.txt"))   
  69.             using (StreamWriter writer = new StreamWriter("1.txt"))   
  70.             using (SqlConnection conn = new SqlConnection())   
  71.             using (SqlCommand cmd = new SqlCommand())   
  72.             {   
  73.                 //这样操作也可以最后释放所有资源,并且不会因嵌套using而产生太多缩进   
  74.                 //通过reflector观察发现系统最后会生成跟嵌套using相同的代码   
  75.             }   
  76.   
  77.   
  78.         }   
  79.     }   
  80. }   
  81.   
  82. //总结起来如下:   
  83. //1.引入命名空间   
  84. //2.创建别名   
  85. //3.强制资源清理  

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值