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
}
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接口的类,都可以使用这种方式。
![](https://img2022.cnblogs.com/blog/211353/202209/211353-20220901151000248-425836464.png)
然后,使用using创建资源对象。
![](https://img2022.cnblogs.com/blog/211353/202209/211353-20220901151013053-139558932.png)
最后,查看编译后生成的IL代码文件,可以看到确实如上面所说,using(...)语句经编译器编译之后,转换了try{...}finally{...},并且在finally{}中完成了对Dispose()方法的调用。
![](https://img2022.cnblogs.com/blog/211353/202209/211353-20220901151034456-2126422643.png)
至此,using()如何完成对非托管资源的释放,就很清楚了。
05.总结
using()语句编译后生成 try{...} finally{...} 语句,进而确保资源释放。
using()是程序中使用非托管资源的最佳方式。
using()的本质是C#中的语法糖。
糖让人快乐,同样语法糖也能让编程变得快乐,类似using()的语法糖,可以简化代码,确保必要逻辑的正确执行;糖只是调味剂,同样语法糖也只是简化编码,核心业务逻辑,还需要开发人员完成。
using的用法很简单,在合适的场景下正确使用,可以让开发工作事半功倍。
认为内容有价值的可以点赞,转发,关注【公众号:刘先生的IT乐园】
相关文章
- 为什么35岁的C++依然能主导编程世界
- 软件系统过载保护:熔断器设计模式
- Kafka Java客户端代码示例
- 6个代码编写技巧 让你的编码技能飞跃提升
- 报告:新毕业程序员平均年薪暴涨44%
- 程序员生存定律:打造属于自己的稀缺性
- 使用Protocol Buffers代替JSON的五个原因
- PHP终于迎来自己的正式语言规范
- 程序员逆袭应具备的7大技能
- 职场酸甜苦辣咸:IT女汉子坚持的梦想和原则
- 只有程序员才可以看懂的漫画
- Mac平台上排名前10位的PHP IDE
- 赠与那些斗志昂扬却漫无目的的程序员的建议
- 程序员,请优先提高代码的可读性
- 国外程序员推荐:每个程序员都应该读的非编程书
- 最糟糕的编程面试题
- async & await 的前世今生
- 异步编程In .NET:APM/EAP和async/await
- 编程同写作,写代码只是在码字
- 程序员需谨记的8条团队开发原则