在平时的开发过程中,一直粗心大意,没有细细的琢磨一些东西,直到一次面试,才恍然大悟,于是下定决心,好好学习一下。
首先抛出本文要研究的.NET关键字:using
开门见山的说,using关键字共有三种用法:引入命名空间、为命名空间或类型创建别名、强制资源清理。
首先,说说第一种用法:引入命名空间
这个用法的使用应该是最多的,在cs文件的顶部添加新的命名空间的引用,示例代码如下:
2
3 // 例如:
4 using System;
5 using System.IO;
6 using System.Web;
7 using System.Text;
8
9 // 等等
这种用法相当简单,应该没有什么问题。
其次,说说第二种用法:为命名空间或类型创建别名
在有些时候,我们会对一些方法取相同的名字,但是这些方法又分布在不同的命名空间下面,在调用的时候,我们不仅要使用方法名称,还要给出命名空间加以限制,避免调了不恰当的方法,这时,我们就可以在引用该命名空间的时候,为其添加一个别名,这样有助于提高开发的效率,同时也提高了代码的准确性和可读性。示例代码如下:
这种用法相对来说也没有太大的难度,而且还可以培养一个好的编程习惯,似乎一举两得了,呵呵,接下来,说说我认为是using最重要(相对来说,也是最难)的一个用法。
最后,说说第三种用法:强制资源清理
对于本用法,我觉得应该首先说说.NET垃圾回收机制(本文不可能详细的阐述,相关详细的介绍,稍后奉上)。垃圾回收是.NET对资源的一种管理方式,大部分情况下,它是自动执行的,当资源不再使用的时候,.NET会自动对该资源进行释放。这里的自动释放很显然是隐式的,如果要显示的释放或者关闭一个对象,就要使用到Dispose模式。
Dispose模式用于在.NET中释放对象封装的非托管资源,因为非托管资源不受GC控制,对象必须调用自己的Dispose方法来释放,这个就是所谓的Dispose模式,从概念上不难理解。而从实现上来说,Dispose模式就是要让类型实现IDisposable接口,从而使得该类具有一个公有的Dispose方法以供调用。
最常见的如:SqlConnection、SqlDataReader等都是继承并实现了接口IDisposable,从而使我们在使用的时候,可以使用以下语句:
2
3 using (SqlConnection conn = new SqlConnection(_connectionString))
4 {
5 //
6 }
这样就实现了Dispose模式,从而释放了资源。
那么,如果是在我们自己定义的类中,同样要继承IDisposable接口,并且需要手动来实现。示例代码如下:
上面这个模式,就是对自定义类实现了using语句的用法,不过有一点需要注意的是,通过查看IL可以得知,using的真实形态应该“try-finally”模块,并没有实现其中的“catch”部分,所以,using模式是不会抛出异常的,要想抛出异常,就应该像上面那样来自己实现一个类,自定义catch部门,就可以抛出异常了。话说回来,在这个模式中,对Dispose方法进行了重载,并且添加了一个“disposing”参数,该参数是用来区别当前是否被Dispose方法所调用。如果是被Dispose方法所调用,就要释放托管和非托管资源,而如果是被~MyClass()(也就是C#的Finalize())调用了,就只需要释放非托管资源了。而且,这个模式还有几个特点应该注意:
Finalize只释放非托管资源
Dispose释放了托管和非托管资源
重复调用Finalize和Dispose是没有问题的(因为有私有成员_disposed的限制)
Finalize和Dispose共享相同的资源释放策略
好了,差不多就这样了,若有遗漏的地方,后续补充。