• C# using()的本质


    “ 程序世界没有秘密,所有答案都在源码里 ” 

      

    01.点明观点 

    C#中,非托管资源使用之后必须释放,而using()是使用非托管资源的最佳方式,可以确保资源在代码块结束之后被正确释放,并且代码更简洁。

    这里说的非托管资源指的是实现IDisposable或IAsyncDisposable接口的类。

    using是如何实现资源释放?本文将予以解答。

     

    02.C#中,using的两个作用 

    第一种:引入命名空间

    用法如下:

    using System.Text;
    using s = System.Text;       //为命名空间定义别名
    using static System.Math;    //引入类型静态成员
    global using System.Math;    //全局引入
    

     

    第二种:声明一个对象,并确保该对象在代码块执行完之后被释放(Dispose())。

    这里主要对第二种用法进行分析。

     

    03.using如何实现资源释放 

    通常,我们以下面的形式声明一个非托管资源,当代码块执行完之后,资源会自动释放,那程序是如何做到的呢?
    using (var file = File.Open("filePath", FileMode.OpenOrCreate))
    {
        //do something
    }
    
    说起来也简单:
    using(...)语句经编译器编译之后,转换了try{...}finally{...}
    上面的代码,经程序编译后的代码如下:
    FileStream file = File.Open("filePath", FileMode.OpenOrCreate);
    try
    {
      //do something
    }
    finally
    {
      if (file!= null)
      {
        ((IDisposable)file).Dispose();
      }
    }
    

    两段代码的运行结果是一样的,对比之下,很明显,使用using()的代码更简洁。

     

    04.实践探索

    实践出真知,我们通过一个例子,使用反编译工具(ILSpy或ILDasm)查看生成的DLL,进行验证。

    首先,定义一个实现了IDisposable接口的类。当然也可以使用.NET中内置的类,这里采用自定义类是为了验证,只要是实现了IDisposable接口的类,都可以使用这种方式。

    然后,使用using创建资源对象。

    最后,查看编译后生成的IL代码文件,可以看到确实如上面所说,using(...)语句经编译器编译之后,转换了try{...}finally{...},并且在finally{}中完成了对Dispose()方法的调用。 

    至此,using()如何完成对非托管资源的释放,就很清楚了。

     

    05.总结 

    using()语句编译后生成 try{...} finally{...} 语句,进而确保资源释放。

    using()是程序中使用非托管资源的最佳方式。

    using()的本质是C#中的语法糖。

    糖让人快乐,同样语法糖也能让编程变得快乐,类似using()的语法糖,可以简化代码,确保必要逻辑的正确执行;糖只是调味剂,同样语法糖也只是简化编码,核心业务逻辑,还需要开发人员完成。

    using的用法很简单,在合适的场景下正确使用,可以让开发工作事半功倍。

     


    认为内容有价值的可以点赞,转发,关注【公众号:刘先生的IT乐园】

     
  • 相关阅读:
    2022国赛C题解析
    计数的窗口函数应用(2)
    在腾讯干软件测试4年,来面试要求35k,让我见识到了真正的测试届天花板...
    【C++】哈希思想的应用——位图、布隆过滤器和哈希切割
    防暴力破解服务器ssh登入次数限制
    web前端在手机端打开进行页面提示——手机端适配问题
    NSS [NCTF 2018]小绿草之最强大脑
    WanAndroid(鸿蒙版)开发的第五篇
    【Golang】判断某一类型是否实现指定接口的几种方法
    【Overload游戏引擎细节分析】Lambert材质Shader分析
  • 原文地址:https://www.cnblogs.com/flame7/p/16646596.html