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:
- using System; //using 引用命名空间
- using System.Collections.Generic;
- using System.Text;
- using System.IO;
- using System.Data;
- using System.Data.SqlClient;
- using System.Xml;
- using Excel = Microsoft.Office.Interop.Excel; //using 创建别名
- namespace statement
- {
- //指定Font类的别名为F
- using F = System.Drawing.Font;
- class Program
- {
- static void Main(string[] args)
- {
- //using 强制资源清理
- using (TextWriter writer = File.CreateText(@"E:/test.txt"))
- {
- //使用别名来实例化对象
- F font = new F("宋体", 12);
- writer.WriteLine(font.Name.ToString() + font.Size.ToString());
- }
- //上面的using语句等价于
- TextWriter w = File.CreateText(@"E:/test.txt");
- try
- {
- F font = new F("宋体", 12);
- w.WriteLine(font.Name.ToString() + font.Size.ToString());
- }
- finally
- {
- if (w != null) w.Dispose();
- }
- //也可以在using之前声明对象 ,NOT Recommended.
- TextReader r = File.OpenText("E://test.txt");
- using (r)
- {
- Console.WriteLine(r.ReadToEnd());
- }
- //对象类型相同时,可以使用多个:
- using (StreamReader reader = new StreamReader("1.txt"), reader2 = new StreamReader("2.txt"))
- {
- //do something
- }
- //嵌套using
- using (SqlConnection conn = new SqlConnection())
- {
- using (SqlCommand cmd = new SqlCommand())
- {
- //嵌套using 缩进太多,从而不便于观察代码,可以用,但适可而止,如果有多层嵌套请使用 多重using
- //这一层如果出错,不会影响上一层conn的释放,也就是说可以这么用
- }
- }
- //多重using
- using (StreamReader reader = new StreamReader("1.txt"))
- using (StreamWriter writer = new StreamWriter("1.txt"))
- using (SqlConnection conn = new SqlConnection())
- using (SqlCommand cmd = new SqlCommand())
- {
- //这样操作也可以最后释放所有资源,并且不会因嵌套using而产生太多缩进
- //通过reflector观察发现系统最后会生成跟嵌套using相同的代码
- }
- }
- }
- }
- //总结起来如下:
- //1.引入命名空间
- //2.创建别名
- //3.强制资源清理