zoukankan      html  css  js  c++  java
  • Effective C# 学习笔记(十五)使用Using和Try/Finally 进行资源清理

    .NET 环境规定由使用类创建实例对象的代码来处理对象的资源回收操作,也就是由调用对象的代码来调用Dispose()(实现IDisposable接口)方法来处理资源回收。

     

    所有拥有托管资源的类型都实现了IDisposable接口,并且都创建了一个finalizer来防止你没有显示地调用dispose,但若依赖于此,在执行此类finalizer释放资源操作时,由于贮存在内存中的资源过多,执行释放操作会使程序变得很慢。

     

    好在C#提供了using 关键字来帮助你确保时候后释放资源,其在编译时会生成和try/finally同样的的IL代码。其会在释放资源时通知GC去释放资源,其内部调用的方法为:GC.SuppressFinalize()。使用方法和try/finally对比代码如下:

     

    SqlConnection myConnection = null;

    // Example Using clause:

    using (myConnection = new SqlConnection(connString))

    {

    myConnection.Open();

    }

    // example Try / Catch block:

    try

    {

    myConnection = new SqlConnection(connString);

    myConnection.Open();

    }

    finally

    {

    myConnection.Dispose();

    }

     

    注意:using 只能用于实现了IDisposable接口的方法的类型,否则编译时就会报错了

     

    若你不知道你要是用的对象是否支持IDisposable接口,那么你可以使用 as语法,假定其可以被using代码如下:

     

    // The correct fix.

    // Object may or may not support IDisposable.

    object obj = Factory.CreateResource();

    using (obj as IDisposable)

    Console.WriteLine(obj.ToString());

     

    注意:若有多个嵌套的支持IDisposable接口对象的资源使用情况,请使用try/finally,以免生成过多的try/finally嵌套 IL代码。

     

    最后,记住一点,不要在对象还被其他对象引用时就调用其Dispose方法。

  • 相关阅读:
    POJ 1873 The Fortified Forest
    C语言中time函数获取系统时间
    回车符号与换行符号
    [转]NYOJ-511-移动小球
    C语言的inline
    C语言编译全过程
    linux下面安装配置mongoDB
    linux下面安装配置LAMP环境
    linux下面的解压缩文件的命令
    day23 正则,re模块
  • 原文地址:https://www.cnblogs.com/haokaibo/p/2101469.html
Copyright © 2011-2022 走看看