• using全接触


          在平时的开发过程中,一直粗心大意,没有细细的琢磨一些东西,直到一次面试,才恍然大悟,于是下定决心,好好学习一下。

          首先抛出本文要研究的.NET关键字:using

          开门见山的说,using关键字共有三种用法:引入命名空间为命名空间或类型创建别名强制资源清理

          首先,说说第一种用法:引入命名空间

          这个用法的使用应该是最多的,在cs文件的顶部添加新的命名空间的引用,示例代码如下:

    1 // using NameSpace
    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,从而使我们在使用的时候,可以使用以下语句:

    1 // 上面代码省略
    2 
    3 using (SqlConnection conn = new SqlConnection(_connectionString))
    4 {
    5       // 
    6 }

          这样就实现了Dispose模式,从而释放了资源。

          那么,如果是在我们自己定义的类中,同样要继承IDisposable接口,并且需要手动来实现。示例代码如下:

    继承IDisposable

           上面这个模式,就是对自定义类实现了using语句的用法,不过有一点需要注意的是,通过查看IL可以得知,using的真实形态应该“try-finally”模块,并没有实现其中的“catch”部分,所以,using模式是不会抛出异常的,要想抛出异常,就应该像上面那样来自己实现一个类,自定义catch部门,就可以抛出异常了。话说回来,在这个模式中,对Dispose方法进行了重载,并且添加了一个“disposing”参数,该参数是用来区别当前是否被Dispose方法所调用。如果是被Dispose方法所调用,就要释放托管和非托管资源,而如果是被~MyClass()(也就是C#的Finalize())调用了,就只需要释放非托管资源了。而且,这个模式还有几个特点应该注意:

          Finalize只释放非托管资源

          Dispose释放了托管和非托管资源

          重复调用Finalize和Dispose是没有问题的(因为有私有成员_disposed的限制)

          Finalize和Dispose共享相同的资源释放策略

          好了,差不多就这样了,若有遗漏的地方,后续补充。

    谁无虎落平阳日,待我风云再起时!

  • 相关阅读:
    请求内部转发与重定向区别
    JSTL标签
    JSP学习总结
    JSP执行过程
    Cookie实现--用户上次访问时间
    python 关键知识点
    PIL 学习
    python 与 matlab 混编
    matplotlib 中文显示 的问题
    中文文本分类1
  • 原文地址:https://www.cnblogs.com/jacksonwj/p/1523442.html
Copyright © 2020-2023  润新知