首页 > 编程语言 >C# using()的本质

C# using()的本质

时间:2022-09-01 18:55:26浏览次数:86  
标签:... C# 代码 本质 finally using 资源

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

源自【公众号:刘先生的IT乐园】 原文链接: 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乐园】

 

标签:...,C#,代码,本质,finally,using,资源
From: https://www.cnblogs.com/flame7/p/16646596.html

相关文章

  • APISpace 未来7天生活指数API
    APISpace的未来7天生活指数API,支持国内3400+个城市以及国际4万个城市的天气指数数据,包括晨练、洗车、穿衣、感冒、运动、旅游、舒适度、紫外线、钓鱼、晾晒、过敏、啤酒......
  • C++ 之lambda表达式
    C++之lambda表达式[capture](parameters)option->return-type{body}capture:捕获列表,可选捕捉列表总是出现在lambda表达式的开始。实际上,是lambda引出符,编译......
  • C# 删除文件目录下所有文件
    publicstaticvoidDelectDir(stringsrcPath){try{DirectoryInfodir=newDirectoryInfo(srcPath);FileSystemInfo[]fileinfo=dir.Ge......
  • C++之常用的算法
    C++之常用的算法1函数对象重载函数调用运算符的类,其对象称为函数对象。一元仿函数/二元仿函数(根据参数个数判定)classMyPrint{public: voidoperator()(intn......
  • SocketLog 的基本使用
    前言:    最近在封装一个日志类时,想借鉴一下TP的实现方式,特别注意了一下TP日志的驱动。平时常用文件形式记录日志却忽略了还有一个Socket方式,只需要连接一下......
  • 句柄的本质?
    浅析句柄的本质本文讨论句柄的本质,使程序员能够真正熟悉经常使用的句柄的含义。相信通过本文会对句柄有一个确切的认识,能够更好的指导编程开发。在Windows中,句柄是非常有用......
  • GPU多卡训练torch模型
    用命令即可:python3-mtorch.distributed.launch--nproc_per_node8train.py或者使用Accelerator: https://huggingface.co/docs/transformers/v4.21.2/en/accelerate......
  • .net core微服务系列之前言
    微服务概念其实已经流行了不短的年头了,只是大部分实战都是在以java为主的大型互联网公司使用,.net在国内的市场,作为.net程序猿们都懂得,就拿北京来说,前2年别说微服务了,就......
  • 连接MySQL出现Host is not allowed to connect to this MySQL server 解决方法
    前言关于这个问题在网上看过一些教程方法,因为本人是更倾向于细致化的比较看得懂,所以在操作的时候就一起记录一下操作步骤了提示:以下是本篇文章正文内容,下面案例可供参考......
  • APISpace 通知短信API
    当您需要快速通知用户时,通知短信是最快捷有效的方式。APISpace的通知短信API,支持三大运营商,虚拟运营商短信发送,电信级运维保障,独享专用通道。发送短信之前,提交签名和模......