C# using()的使用方法

作者:北京刘先生 时间:2022-03-02 23:23:37 

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接口的类,都可以使用这种方式。

C# using()的使用方法

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

C# using()的使用方法

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

C# using()的使用方法

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

05.总结 

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

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

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

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

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

来源:https://www.cnblogs.com/flame7/p/16646596.html

标签:C#,using()
0
投稿

猜你喜欢

  • SpringBoot项目集成Flyway进行数据库版本控制的详细教程

    2023-11-24 05:20:33
  • IDEA 2021.2 激活教程及启动报错问题解决方法

    2023-11-14 14:10:27
  • Android实现悬浮窗的简单方法实例

    2023-06-17 18:11:02
  • 心动吗?正大光明的免费使用IntelliJ IDEA商业版

    2023-11-25 04:29:48
  • vscode+platformIO开发stm32f4的实现

    2023-11-02 16:43:37
  • Hutool开发MapUtil工具类使用示例

    2022-10-21 22:49:27
  • Java编程实现获取当前代码行行号的方法示例

    2021-06-28 06:51:14
  • Java8时间接口LocalDateTime详细用法

    2023-11-25 09:56:49
  • Java线程状态变换过程代码解析

    2023-08-06 18:05:29
  • 聊一聊SpringBoot服务监控机制

    2023-02-09 02:47:48
  • Java编程基础测试题分享

    2023-11-27 22:14:58
  • 聊聊SpringMVC项目依赖和静态资源导出问题

    2023-03-26 13:32:20
  • java获取当前时间的四种方法代码实例

    2023-11-28 19:22:53
  • maven基础教程——简单了解maven的特点与功能

    2023-09-07 03:43:02
  • C# 中用 Sqlparameter 的两种用法

    2022-11-19 03:52:52
  • SpringBoot访问外部文件及默认路由问题

    2021-08-12 10:58:01
  • Mybatis中的mapper模糊查询语句LIKE

    2022-02-17 16:21:15
  • 详解SpringMVC如何进行数据回显

    2023-09-12 08:48:15
  • Java使用组合模式实现表示公司组织结构功能示例

    2022-07-31 08:03:37
  • React-Native之Android(6.0及以上)权限申请详解

    2023-07-28 01:56:55
  • asp之家 软件编程 m.aspxhome.com