前言
我原本認(rèn)為對(duì)于IDispose的實(shí)現(xiàn)方法,只要在里面釋放非托管資源就行了,但是通過(guò)網(wǎng)上資料,看到很多實(shí)現(xiàn)方法并不是僅僅做釋放非托管資源,非常迷惑,關(guān)鍵是這些資料也沒(méi)詳細(xì)的告訴你為什么這么做?之后通過(guò)StackOverflow了解到這一步一步的原因,說(shuō)的十分詳細(xì),結(jié)合自己的認(rèn)識(shí),翻譯后分享給大家:
一、IDispose的實(shí)現(xiàn)方法
具體的實(shí)現(xiàn)方法,你可以直接查看這個(gè)創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司網(wǎng)站的教程:
https://www.jb51.net/article/54899.htm
如果你能看懂,并且很清楚為什么那么做。那么以下的文章你就可以略去不看。如果不清楚為什么那么做,請(qǐng)帶著你的迷惑往下看:
二、為什么那樣實(shí)現(xiàn)
英文好的可以直接去StackOverflow原文地址:
https://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface/538238#538238
2.1、進(jìn)行之前
在C++中,所有你在堆上申請(qǐng)的內(nèi)存空間,必須手動(dòng)釋放掉,否則就會(huì)造成內(nèi)存的泄露。這可能會(huì)讓你在寫(xiě)程序的時(shí)候要花點(diǎn)心思在內(nèi)存的管理上而不是專(zhuān)注于解決你編程的目的—解決問(wèn)題。所以作為C++的進(jìn)化版C#使用了GC(Garbage Collector)來(lái)進(jìn)行內(nèi)存的管理以達(dá)到自動(dòng)釋放不需要的內(nèi)存的目的,但是GC并不能做的十分完美,對(duì)于一些非托管資源,GC無(wú)能為力,這就要求我們必須手動(dòng)的釋放那么非托管資源,為了更好的去做到這一點(diǎn),我們就要編寫(xiě)一種方法,通過(guò)手動(dòng)調(diào)用這個(gè)方法,我們就能夠釋放掉非托管資源。
注:
什么是托管資源和非托管資源?
托管資源就是托管給CLR的資源,CLR能對(duì)這些資源進(jìn)行管理。而非托管資源則是CLR無(wú)法對(duì)這些資源管理,這些資源的申請(qǐng)、釋放必須由使用者自行管理。
例如,像Win32編程中的文件句柄,上下文句柄、窗口或網(wǎng)絡(luò)連接等資源都屬于非托管資源。但是如果這些非托管資源在.Net中進(jìn)行了封裝,成為了.Net類(lèi)庫(kù)中的一部分,它就不屬于非托管資源了,因?yàn)樵趯?duì)它們封裝的過(guò)程中,就實(shí)現(xiàn)了它們的自動(dòng)管理功能。
也就是說(shuō),你能在.Net中找到的類(lèi)產(chǎn)生的對(duì)象,都是托管資源。
(理解這點(diǎn)很重要,這可能是你看不懂上面實(shí)現(xiàn)教程的重要一個(gè)原因!)
注:
GC進(jìn)行垃圾回收的時(shí)間和順序?
GC進(jìn)行垃圾回收的時(shí)間我們根本無(wú)法確定(當(dāng)然你手動(dòng)調(diào)用GC的垃圾回收方法除外),并且順序也不能確定!也就是說(shuō),你先申請(qǐng)的空間有可能在你后申請(qǐng)的空間釋放之后釋放。
GC對(duì)于實(shí)現(xiàn)析構(gòu)函數(shù)和沒(méi)實(shí)現(xiàn)析構(gòu)函數(shù)的類(lèi)處理方法不一樣,簡(jiǎn)單些說(shuō)GC對(duì)于實(shí)現(xiàn)了析構(gòu)函數(shù)的類(lèi)一定會(huì)調(diào)用他們的析構(gòu)函數(shù)。
關(guān)于.Net的垃圾回收機(jī)制,你可以暫時(shí)先知道這么多,待看完了這篇文章再去深入了解。
2.2、我們需要編寫(xiě)一種方法去釋放!
為了去清除一些非托管資源,你創(chuàng)建的類(lèi)需要有一個(gè)public方法,方法的名字可以隨意命名
例如:
public void Cleanup() public void Shutdown() ……
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁(yè)名稱(chēng):C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)詳解-創(chuàng)新互聯(lián)
鏈接URL:http://jinyejixie.com/article8/hijip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、Google、網(wǎng)站維護(hù)、云服務(wù)器、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容