zoukankan      html  css  js  c++  java
  • 提高系统性能

    使用using释放资源

    (1)using用来释放一个对象占用的重要资源,不仅仅包括数据库对象,还有文件读写对象等;

     (2)使用using语法的对象都需要实现IDisable接口的Dispose()方法。

      该方法专门用来释放对象占用的重要资源。

     (3)Dispose()方法封装了对Close()方法的调用。

    What is the resource ?

    资源是实现 System.IDisposable 的类或结构,它包含名为 Dispose 的单个无参数方法 正在使用资源的代码可以调用 Dispose 以指示不再需要该资源。如果不调用 Dispose,则最终将因为垃圾回收而发生自动处置。

    如果资源获取的形式是局部变量声明,那么此局部变量声明的类型必须为System.IDisposable 或是可以隐式转换为 System.IDisposable 的类型。如果资源获取的形式是表达式,那么此表达式必须是 System.IDisposable 或是可以隐式转换为 System.IDisposable 的类型。

    在资源获取中声明的局部变量必须是只读的,且必须包含一个初始值设定项。

    using 语句被翻译成三个部分:获取、使用和处置。资源的使用隐式封闭在包含一个 finally 子句的 try语句中。此 finally 子句处置资源。如果获取了 null 资源,则不进行对 Dispose 的调用,也不引发任何异常。

    例如,下列形式的 using 语句

    using (R r1 = new R()) {
    r1.F();
    }
    完全等效于

    R r1 = new R();
    try {
    r1.F();
    }
    finally {
    if (r1 != null) ((IDisposable)r1).Dispose();
    }

    Using的两个作用:

                     作用1:导入命名空间

                     作用2:释放对象占用的资源,如Connection,DataReader,FileStream

    Using引起来的对象的作用域只在花括号,出了{}就不再起作用了。

     Dispose:

    .close()和dispose()区别?

    close()只是关闭连接,但是通道没有销毁,dispose()不仅把连接给关闭了,而且把通道也给销毁了。

    Dispose方法会自动调用Close()

    要想让一个类型可以通过using管理,该类型或者父类必须实现了IDisposable接口。

    using(SqlConnection con=new SqlConnection)

    {

       //本质上自动调用了Dispose方法

    }

    什么样的的语句可以使用using管理??

    稀缺的资源,才需要using管理。

     using语句方法

    它常见于非托管资源(也就是在C++编程里面可能碰到的句柄和设备上下文),这些资源使用完毕后,是必须释放的。在C#里面,由于完全的面向对象编程,这些资源类型都实现了IDisposable接口,因此会使用在捕获异常try...catch语句的finally块中释放资源,代码如下:

    1. {  
    2.   Font font1 = new Font("Arial", 10.0f);  
    3.   try  
    4.   {  
    5.     byte charset = font1.GdiCharSet;  
    6.   }  
    7.   finally  
    8.   {  
    9.     if (font1 != null)  
    10.       ((IDisposable)font1).Dispose();  
    11.   }  

    这样确保调用Dispose,从而保证释放资源。(请注意,使用额外的大括号为对象创建有效的范围而此时如果使用using语句,同样能够获得相同的结果,代码如下:

    1. using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f))  
    2. {  
    3.     // Use font3 and font4.  

    using语句按照正确的方式调用对象上的Dispose方法,并(在您按照前面所示方式使用它时)会导致在调用 Dispose 时对象自身处于范围之外。在using块中,对象是只读的并且无法进行修改或重新分配。

    同时还要注意的一点是:

    按照规则,当使用IDisposable对象时,应在using语句中声明和实例化此对象。虽然可以在using语句外实例化资源对象,代码如下:

    1. Font font2 = new Font("Arial", 10.0f);  
    2. using (font2) // not recommended  
    3. {  
    4.     // use font2  
    5. }  
    6. // font2 is still in scope  
    7. // but the method call throws an exception  
    8. float f = font2.GetHeight();  

    在这种情况下,该对象将在控制权离开 using 块之后保持在范围内,即使它可能将不再具有对其非托管资源的访问权也是如此。换句话说,再也不能完全初始化该对象。如果试图在 using 块外部使用该对象,则可能导致引发异常,如上述代码段3中的font2.GetHeight()调用而产生异常。由于这个原因,通常最好是在 using 语句中实例化该对象并将其范围限制在 using 块中。

  • 相关阅读:
    最小生成树
    单源最短路
    插入排序 静态链表转为有序数组
    不定时更新
    huffman
    二叉树
    宽度优先搜索
    深度优先搜索
    链表
    jQuery学习中 attr() 和 prop() 的区别
  • 原文地址:https://www.cnblogs.com/sunbin123/p/6664901.html
Copyright © 2011-2022 走看看