這篇文章主要介紹“C#托管資源是什么”,在日常操作中,相信很多人在C#托管資源是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”C#托管資源是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)合作免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
C#托管資源和非托管資源
在C#中,資源分為托管資源和非托管資源兩種。GC在回收無用對(duì)象資源時(shí),可以自動(dòng)回收托管資源(比如托管內(nèi)存),但對(duì)于非托管資源(比如Socket、文件、數(shù)據(jù)庫連接)必須在程序中顯式釋放。
托管資源的回收首先需要GC識(shí)別無用對(duì)象,然后回收其資源。一般無用對(duì)象是指通過當(dāng)前的系統(tǒng)根對(duì)象和調(diào)用堆棧對(duì)象不可達(dá)的對(duì)象。對(duì)象有一個(gè)重要的特點(diǎn)導(dǎo)致無用對(duì)象判斷的復(fù)雜性:對(duì)象間的相互引用!如果沒有相互引用,就可以通過“引用計(jì)數(shù)”這種簡單高效的方式實(shí)現(xiàn)無用對(duì)象的判斷,并實(shí)現(xiàn)實(shí)時(shí)回收。正是由于相互引用的存在導(dǎo)致GC需要設(shè)計(jì)更為復(fù)雜的算法,這樣帶來的***問題在于喪失了資源回收的實(shí)時(shí)性,而變成一種不確定的方式。
對(duì)于非托管資源的釋放,C#提供了兩種方式:
1.Finalizer:寫法貌似C++的析構(gòu)函數(shù),本質(zhì)上卻相差甚遠(yuǎn)。Finalizer是對(duì)象被GC回收之前調(diào)用的終結(jié)器,初衷是在這里釋放非托管資源,但由于GC運(yùn)行時(shí)機(jī)的不確定性,通常會(huì)導(dǎo)致非托管資源釋放不及時(shí)。另外,F(xiàn)inalizer可能還會(huì)有意想不到的副作用,比如:被回收的對(duì)象已經(jīng)沒有被其他可用對(duì)象所引用,但Finalizer內(nèi)部卻把它重新變成可用,這就破壞了GC垃圾收集過程的原子性,增大了GC開銷。
2.Dispose Pattern:C#提供using關(guān)鍵字支持Dispose Pattern進(jìn)行資源釋放。這樣能通過確定的方式釋放非托管資源,而且using結(jié)構(gòu)提供了異常安全性。所以,一般建議采用Dispose Pattern,并在Finalizer中輔以檢查,如果忘記顯式Dispose對(duì)象則在Finalizer中釋放資源。
可以說,GC為程序帶來安全方便的同時(shí)也付出了不小的代價(jià):一則喪失了托管資源回收的實(shí)時(shí)性,這在實(shí)時(shí)系統(tǒng)和資源受限系統(tǒng)中是致命的;二則沒有把C#托管資源和非托管資源的管理統(tǒng)一起來,造成概念割裂。C++的定位之一是底層開發(fā)能力,所以不難理解GC并沒有成為C++的語言特性。雖然我們?cè)贑++0x和各種第三方庫都能看到GC的身影,但GC對(duì)于C++來講并不是那么重要,至多是一個(gè)有益的補(bǔ)充。C++足以傲視C,并和C# GC一較高下的是它的RAII。
到此,關(guān)于“C#托管資源是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!