• 提高系统性能:从数据访问层开始


    使用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 块中。

  • 相关阅读:
    WPF之感触
    C# WinForm 给DataTable中指定位置添加列
    MyEclipse 8.6 download 官方下载地址
    将博客搬至CSDN
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
  • 原文地址:https://www.cnblogs.com/Smile-123/p/5473508.html
Copyright © 2020-2023  润新知