網站首頁 編程語言 正文
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的用法很簡單,在合適的場景下正確使用,可以讓開發工作事半功倍。
原文鏈接:https://www.cnblogs.com/flame7/p/16646596.html
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-02-01 MongoDB?事務支持詳解_MongoDB
- 2022-02-12 Flutter項目中有些依賴不支持64位的library的解決方式
- 2022-09-30 AndroidStudio圖片壓縮工具ImgCompressPlugin使用實例_Android
- 2022-04-25 python?實現兩個字符串乘法小練習_python
- 2022-06-20 python中的隨機數?Random介紹_python
- 2022-12-27 SAP技巧之修改自帶搜索幫助為自定數據集_數據庫其它
- 2022-07-29 Python列表append()函數使用方法詳解_python
- 2022-05-09 .Net?Core創建Api進行文件上傳功能_實用技巧
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支