C# using的本质及使用详解

 更新时间:2022年09月02日 11:44:09   作者:知其所以然  
这篇文章主要为大家介绍了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的用法很简单,在合适的场景下正确使用,可以让开发工作事半功倍。

以上就是C# using的本质及使用详解的详细内容,更多关于C# using使用的资料请关注脚本之家其它相关文章!

相关文章

  • 基于C#调用c++Dll结构体数组指针的问题详解

    基于C#调用c++Dll结构体数组指针的问题详解

    下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#结合Minio实现文件上传存储与更新

    C#结合Minio实现文件上传存储与更新

    MinIO是一个开源的对象存储服务器,专门设计用于在大规模数据存储环境中运行,这篇文章主要为大家介绍了C#如何结合Minio实现文件上传存储与更新,需要的可以参考下
    2024-03-03
  • C#中实现线程同步lock关键字的用法详解

    C#中实现线程同步lock关键字的用法详解

    实现线程同步的第一种方式是我们经常使用的lock关键字,它将包围的语句块标记为临界区,这样一次只有一个线程进入临界区并执行代码,接下来通过本文给大家介绍C#中实现线程同步lock关键字的用法详解,一起看看吧
    2016-07-07
  • 使用aspose.word 第三方的插件实现导出word

    使用aspose.word 第三方的插件实现导出word

    本文给大家分享的是一个使用使用aspose.word 第三方的插件实现导出word的实例,十分的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • C# 中的委托与事件机制详解

    C# 中的委托与事件机制详解

    本文详细介绍了C#中委托和事件的概念、使用方法和应用场景,包括委托定义、匿名方法、Lambda表达式、事件机制和多播委托的详细说明,委托作为类型安全的函数指针,文章还探讨了如何通过匿名方法和Lambda表达式简化委托的使用,以及多播委托在事件处理中的应用
    2024-10-10
  • C#中调用SAPI实现语音识别的2种方法

    C#中调用SAPI实现语音识别的2种方法

    这篇文章主要介绍了C#中调用SAPI实现语音识别的2种方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • C#使用smtp发送带附件的邮件实现方法

    C#使用smtp发送带附件的邮件实现方法

    这篇文章主要介绍了C#使用smtp发送带附件的邮件实现方法,可直接将string类型结果保存为附件,实例中备有相应的注释便于理解,需要的朋友可以参考下
    2014-11-11
  • C# Double转化为String时的保留位数及格式方式

    C# Double转化为String时的保留位数及格式方式

    这篇文章主要介绍了C# Double转化为String时的保留位数及格式方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C#利用StreamReader和StreamWriter类处理文本的字符编码使用示例

    C#利用StreamReader和StreamWriter类处理文本的字符编码使用示例

    .NET Framework 中,StreamReader 和 StreamWriter 类提供了一些方法来处理字符编码,这篇文章主要介绍了C#利用StreamReader和StreamWriter类处理文本的字符编码使用示例,需要的朋友可以参考下
    2024-06-06
  • Unity3D使用右键菜单打开工程

    Unity3D使用右键菜单打开工程

    这篇文章主要为大家详细介绍了Unity3D使用右键菜单打开工程的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03

最新评论