using语句适用于那些需要及时释放资源的代码,其一般形式为:
using (type obj=initialization) //也可以包含多个obj的初始化或new,中间用逗号分隔即可。
{
//具体的处理代码
}
其实using语句本质上是对try语句的封装,等价于:
{
type obj=initialization;
try
{
//具体处理代码
}
finally
{
if (obj!=null)
{
((IDisposable)obj).Dispose(); //调用对象的Dispose()方法,销魂对象。
}
}
}
从上面的等价关系可以看出,using语句适用于任何包含Dispose()方法且需要及时销毁的对象。另外常常看到一些对象的销毁用close()方法,其实close()方法和Dispose()方法的功能基本上是一样的,都是用来销毁对象(Close是为了那些不熟悉Dispose的开发者设计的。因为基本上所有的developer都知道Close是干吗的,特别是对于那些有C++背景的developer)。实际上,一般情况下,Close()方法就是通过调用Dispose()方法来实现的。要记住的是:using里面的object必须能被隐式的转变为IDisposable才行,所以只会调用Dispose。
下面举一个常用的例子,处理文件时,必须显示的关闭用close方法,如果发生异常就会丢失一些内存资源,所以常常将close方法放在try-catch块的finally中。如果用using块就会方便很多,代码也很简洁漂亮。
using (FileStream fileStream=File.OpenText(path))
{
byte[ ] datas={100,101,102};
fileStream.Write(datas,0,datas.Length);
}
还有一个例子是数据库连接的例子如下:
using (SqlConnection cn = new SqlConnection(SqlConnectionString)){……}
在上面语句中当退出using语句时会及时自动的关闭流对象fileStream,非常方便,而不用显示的再去调用Close方法了,数据库连接的例子也一样。
其实c#中Using语句共有三种用途:分别是
(1)作为语句,用于定义一个范围,在此范围的末尾将释放对象 ,这个就是只上面讲的内容,以下就不赘述了。
(2)引用命名空间,这样就可以直接在程序中引用命名空间的类型而不必指定详细的命名空间。
比如大家最常用的:using System.Text;
(3)为命名空间或类型创建别名。
当同一个cs引用了不同的命名空间,但这些命名控件都包括了一个相同名字的类型的时候,可以使用C# using关键字来创建别名,这样会使代码更简洁。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的。
- using System;
- using aClass = NameSpace1.MyClass; //为MyClass类定义了一个别名
- using bClass = NameSpace2.MyClass;
- ……
- //使用方式
- aClass my1 = new aClass();
- Console.WriteLine(my1);
- bClass my2 = new bClass();
- Console.WriteLine(my2);