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的用法很簡單,在合適的場景下正確使用,可以讓開發工作事半功倍。
以上就是C# using的本質及使用詳解的詳細內容,更多關於C# using使用的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- ASP.NET在VS2022中使用Dispose釋放資源實例
- C#中流的使用和分類
- 詳解C#對路徑…的訪問被拒絕解決過程
- C#利用NPOI操作Excel(單元格設置)
- C#合並BitMap圖像生成超大bitmap