C# using()的本质

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# using()的本质相关的知识,希望对你有一定的参考价值。

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

01

亮观点

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

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

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

02

using的两个作用

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的用法很简单,在合适的场景下正确使用,可以让开发工作事半功倍。


认为内容有价值的可以点赞,转发,关注

以上是关于C# using()的本质的主要内容,如果未能解决你的问题,请参考以下文章

创业管理-易学实用的创业真知

c# using的疑问

C#中using的一个用法

C#中using(...){...}的意思

为啥 C# 为 `using` 定义了两种不同的用法?

C# using垃圾回收详解