網(wǎng)站首頁 編程語言 正文
01.點(diǎn)明觀點(diǎn)
C#中,非托管資源使用之后必須釋放,而using()是使用非托管資源的最佳方式,可以確保資源在代碼塊結(jié)束之后被正確釋放,并且代碼更簡潔。
這里說的非托管資源指的是實(shí)現(xiàn)IDisposable或IAsyncDisposable接口的類。
using是如何實(shí)現(xiàn)資源釋放?本文將予以解答。
02.C#中,using的兩個(gè)作用
第一種:引入命名空間
用法如下:
using System.Text;
using s = System.Text; //為命名空間定義別名
using static System.Math; //引入類型靜態(tài)成員
global using System.Math; //全局引入
第二種:聲明一個(gè)對(duì)象,并確保該對(duì)象在代碼塊執(zhí)行完之后被釋放(Dispose())。
這里主要對(duì)第二種用法進(jìn)行分析。
03.using如何實(shí)現(xiàn)資源釋放
通常,我們以下面的形式聲明一個(gè)非托管資源,當(dāng)代碼塊執(zhí)行完之后,資源會(huì)自動(dòng)釋放,那程序是如何做到的呢?
using (var file = File.Open("filePath", FileMode.OpenOrCreate))
{
//do something
}
說起來也簡單:
using(...)語句經(jīng)編譯器編譯之后,轉(zhuǎn)換了try{...}finally{...}
上面的代碼,經(jīng)程序編譯后的代碼如下:
FileStream file = File.Open("filePath", FileMode.OpenOrCreate);
try
{
//do something
}
finally
{
if (file!= null)
{
((IDisposable)file).Dispose();
}
}
兩段代碼的運(yùn)行結(jié)果是一樣的,對(duì)比之下,很明顯,使用using()的代碼更簡潔。
04.實(shí)踐探索
實(shí)踐出真知,我們通過一個(gè)例子,使用反編譯工具(ILSpy或ILDasm)查看生成的DLL,進(jìn)行驗(yàn)證。
首先,定義一個(gè)實(shí)現(xiàn)了IDisposable接口的類。當(dāng)然也可以使用.NET中內(nèi)置的類,這里采用自定義類是為了驗(yàn)證,只要是實(shí)現(xiàn)了IDisposable接口的類,都可以使用這種方式。
然后,使用using創(chuàng)建資源對(duì)象。
最后,查看編譯后生成的IL代碼文件,可以看到確實(shí)如上面所說,using(...)語句經(jīng)編譯器編譯之后,轉(zhuǎn)換了try{...}finally{...},并且在finally{}中完成了對(duì)Dispose()方法的調(diào)用。
至此,using()如何完成對(duì)非托管資源的釋放,就很清楚了。
05.總結(jié)
- using()語句編譯后生成 try{...} finally{...} 語句,進(jìn)而確保資源釋放。
- using()是程序中使用非托管資源的最佳方式。
- using()的本質(zhì)是C#中的語法糖。
糖讓人快樂,同樣語法糖也能讓編程變得快樂,類似using()的語法糖,可以簡化代碼,確保必要邏輯的正確執(zhí)行;糖只是調(diào)味劑,同樣語法糖也只是簡化編碼,核心業(yè)務(wù)邏輯,還需要開發(fā)人員完成。
using的用法很簡單,在合適的場景下正確使用,可以讓開發(fā)工作事半功倍。
原文鏈接:https://www.cnblogs.com/flame7/p/16646596.html
相關(guān)推薦
- 2022-12-29 Android動(dòng)態(tài)加載布局實(shí)現(xiàn)技巧介紹_Android
- 2023-03-20 pip安裝python庫時(shí)報(bào)Failed?building?wheel?for?xxx錯(cuò)誤的解決方法
- 2022-12-07 Android?IdleHandler使用方法詳解_Android
- 2023-08-28 React綁定antd輸入框,點(diǎn)擊清空或者確定按鈕實(shí)現(xiàn)清空輸入框內(nèi)容
- 2022-10-27 python中namedtuple函數(shù)的用法解析_python
- 2022-11-04 Linux下自動(dòng)刪除過期備份和自動(dòng)異地備份的腳本_linux shell
- 2022-05-06 python畫圖時(shí)給圖中的點(diǎn)加標(biāo)簽和plt.text的使用_python
- 2023-07-25 使用Redis做Mybatis的二級(jí)緩存
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支