<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
using可以算是.NET中新的語法元素,它清楚地說明一個通常比較佔用資源的物件何時開始使用和何時被手動釋放。當using可以被使用時,建議儘量使用using語句。至今為止,使用using語句發現它帶給程式設計師的只有優點,而沒有任何弊端。
在.NET的環境中,託管的資源都將由.NET的垃圾回收機制來釋放,而一些非託管的資源則需要程式設計師手動地將它們釋放。.NET提供了主動和被動兩種釋放非託管資源的方式,即IDisposable介面的Dispose方法和型別自己的Finalize方法。任何帶有非託管資源的型別,都有必要實現IDisposable的Dispose方法,並且在使用完這些型別後需要手動地呼叫物件的Dispose方法來釋放物件中的非託管資源。
如果型別正確地實現了Finalize方法,那麼即使不呼叫Dispose方法,非託管資源也最終會被釋放,但那時資源已經被很長時間無畏地佔據了。
using語句的作用就是提供了一個高效的呼叫物件Dispose方法的方式。對於任何IDisposable介面的型別,都可以使用using語句,而對於那些沒有實現IDisposable介面的型別,使用using語句會導致一個編譯錯誤。
先來看一個using語句的基本語法:
using(StreamWriter sw= new StreamWriter()) { // 中間處理邏輯 }
在上面程式碼中,using語句一開始定義了一個StreamWriter的物件,之後在整個語句塊中都可以使用sw,在using語句塊結束的時候,sw的Dispose方法將會被自動呼叫。using語句不僅免除了程式設計師輸入Dispose呼叫的程式碼,它還提供了機制保證Dispose方法被呼叫,無論using語句塊順利執行結束,還是丟擲了一個異常。下面的程式碼演示了using的這一保護機制。
using System; namespace usingDemo { class Program { static void Main(string[] args) { try { // 使用using using (MyDispose md = new MyDispose()) { md.DoWork(); // 丟擲一個異常來測試using throw new Exception("丟擲一個異常"); } } catch { } finally { Console.ReadKey(); } } } /// <summary> /// 繼承自IDisposable介面,僅僅用來做測試,不使用任何非託管資源 /// </summary> public class MyDispose : IDisposable { public void Dispose() { Console.WriteLine("Dispose方法被呼叫"); } public void DoWork() { Console.WriteLine("做了很多工作"); } } }
在上面的程式碼中,using語句塊丟擲了一個異常,而該異常知道using語句結束後才被捕獲。由於有了using語句的存在,即使異常被丟擲,MyDispose的物件md的DIspose方法仍然被呼叫。 。程式輸出結果如下:
事實上,C#編譯器為using語句自動新增了try/finally塊,所以Dispose方法能夠保證被呼叫到,所以如下兩段程式碼經過編譯後內容將完全一致:
using (MyDispose md = new MyDispose()) { md.DoWork(); }
和
MyDispose md; try { md = new MyDispose(); md.DoWork(); } finally { md.Dispose(); }
在徹底瞭解了using的實現原理以後,還應該注意一點使用using時常犯的錯誤,那就是千萬不要試圖在using語句塊外初始化物件 ,如下面程式碼所示:
MyDispose md = new MyDispose(); using (md) { md.DoWork(); }
看上去似乎沒有任何問題,但是在多執行緒的程式中,上述程式碼就會有隱患。試想當md被初始化後程式突然產生一個異常而中斷,那md物件中的非託管資源將沒有機會得到釋放,這對於系統來說危害是相當大的。所以在任何時候都應該在using語句中初始化需要使用的物件。
using語句為實現了IDisposable的型別物件呼叫Dispose方法,using語句能夠保證使用的物件的Dispose方法在using語句塊結束時被呼叫,無論是否有異常被丟擲。C#編譯器在編譯時自動為using語句加上try/finally塊,所以using的本質和異常捕獲語句一樣,但是語法更為簡潔。所有using使用的物件都應該在using語句開始後再初始化,以保證所有的物件都能夠被Dispose。
到此這篇關於C#中using語句用法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45