C# using的本質(zhì)及使用詳解
01.點(diǎn)明觀點(diǎn)
C#中,非托管資源使用之后必須釋放,而using()是使用非托管資源的最佳方式,可以確保資源在代碼塊結(jié)束之后被正確釋放,并且代碼更簡潔。
這里說的非托管資源指的是實(shí)現(xiàn)IDisposable或IAsyncDisposable接口的類。
using是如何實(shí)現(xiàn)資源釋放?本文將予以解答。
02.C#中,using的兩個作用
第一種:引入命名空間
用法如下:
using System.Text; using s = System.Text; //為命名空間定義別名 using static System.Math; //引入類型靜態(tài)成員 global using System.Math; //全局引入
第二種:聲明一個對象,并確保該對象在代碼塊執(zhí)行完之后被釋放(Dispose())。
這里主要對第二種用法進(jìn)行分析。
03.using如何實(shí)現(xiàn)資源釋放
通常,我們以下面的形式聲明一個非托管資源,當(dāng)代碼塊執(zhí)行完之后,資源會自動釋放,那程序是如何做到的呢?
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é)果是一樣的,對比之下,很明顯,使用using()的代碼更簡潔。
04.實(shí)踐探索
實(shí)踐出真知,我們通過一個例子,使用反編譯工具(ILSpy或ILDasm)查看生成的DLL,進(jìn)行驗(yàn)證。
首先,定義一個實(shí)現(xiàn)了IDisposable接口的類。當(dāng)然也可以使用.NET中內(nèi)置的類,這里采用自定義類是為了驗(yàn)證,只要是實(shí)現(xiàn)了IDisposable接口的類,都可以使用這種方式。
然后,使用using創(chuàng)建資源對象。
最后,查看編譯后生成的IL代碼文件,可以看到確實(shí)如上面所說,using(...)語句經(jīng)編譯器編譯之后,轉(zhuǎn)換了try{...}finally{...},并且在finally{}中完成了對Dispose()方法的調(diào)用。
至此,using()如何完成對非托管資源的釋放,就很清楚了。
05.總結(jié)
- using()語句編譯后生成 try{...} finally{...} 語句,進(jìn)而確保資源釋放。
- using()是程序中使用非托管資源的最佳方式。
- using()的本質(zhì)是C#中的語法糖。
糖讓人快樂,同樣語法糖也能讓編程變得快樂,類似using()的語法糖,可以簡化代碼,確保必要邏輯的正確執(zhí)行;糖只是調(diào)味劑,同樣語法糖也只是簡化編碼,核心業(yè)務(wù)邏輯,還需要開發(fā)人員完成。
using的用法很簡單,在合適的場景下正確使用,可以讓開發(fā)工作事半功倍。
以上就是C# using的本質(zhì)及使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C# using使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用泛型方法實(shí)現(xiàn)操作不同數(shù)據(jù)類型的數(shù)組
這篇文章主要為大家詳細(xì)介紹了C#如何使用一個泛型方法對不同類型的數(shù)組進(jìn)行操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02C#使用OpenCV剪切圖片中的人物頭像的實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用OpenCV剪切圖片中的人物頭像,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02c#使用FreeSql生產(chǎn)環(huán)境時自動升級備份數(shù)據(jù)庫
使用FreeSql,包含所有的ORM數(shù)據(jù)庫,都會存在這樣的問題。在codefirst模式下,根據(jù)代碼自動更新數(shù)據(jù)庫,都建議不要在生產(chǎn)環(huán)境使用。因?yàn)槿菀讈G失數(shù)據(jù),本文提供一種自動更新數(shù)據(jù)庫的解決的思路:在判斷需要升級時,才自動升級,同時升級前先備份數(shù)據(jù)庫2021-06-06通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]
通過VS中的數(shù)據(jù)源選擇對話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]...2007-03-03C#操作數(shù)據(jù)庫總結(jié)(vs2005+sql2005)
C#操作數(shù)據(jù)庫總結(jié),每次做項(xiàng)目都會用到數(shù)據(jù)庫,對數(shù)據(jù)庫的操作都是糊里糊涂從書里找代碼用。通過昨天晚上與今天早上的努力,把數(shù)據(jù)庫的操作整理了一下,下面把整理結(jié)果做個小結(jié)2012-09-09C#根據(jù)http和ftp圖片地址獲取對應(yīng)圖片
這篇文章主要為大家詳細(xì)介紹了C#根據(jù)http和ftp圖片地址獲取對應(yīng)圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06spreadsheetgear插件屏蔽鼠標(biāo)右鍵的方法
今天用到spreadsheetGear插件,然后右鍵有插件自己的菜單。都是英文的,而且還能打開新的窗體。嵌到程序里面,不太合適,所以著手屏蔽2014-02-02