真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#中如何釋放非托管資源

這篇文章主要介紹“C#中如何釋放非托管資源”,在日常操作中,相信很多人在C#中如何釋放非托管資源問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#中如何釋放非托管資源”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司從2013年成立,先為分宜等服務(wù)建站,分宜等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為分宜企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

.NET 平臺在內(nèi)存管理方面提供了GC(Garbage Collection),負(fù)責(zé)自動釋放托管資源和內(nèi)存回收的工作,但它無法對非托管資源進(jìn)行釋放,這時(shí)我們必須自己提供方法來釋放對象內(nèi)分配的非托管資源,比如你在對象的實(shí)現(xiàn)代碼中使用了一個(gè)COM對象

最簡單的辦法,可以通過實(shí)現(xiàn)protected void Finalize()(析構(gòu)函數(shù)會在編譯時(shí)變成這個(gè)東東)來釋放非托管資源,因?yàn)镚C在釋放對象時(shí)會檢查該對象是否實(shí)現(xiàn)了 Finalize() 方法,如果是則調(diào)用它。但,據(jù)說這樣會降低效率……

有一種更好的,那就是通過實(shí)現(xiàn)一個(gè)接口顯式的提供給客戶調(diào)用端手工釋放對象的方法,而不是傻傻的等著GC來釋放我們的對象(何況效率又那么低)

System 命名空間內(nèi)有一個(gè) IDisposable 接口,拿來做這事非常合適,就省得我們自己再聲明一個(gè)接口了

另外補(bǔ)充一句,這種實(shí)現(xiàn)并不一定要使用了非托管資源后才用,如果你設(shè)計(jì)的類會在運(yùn)行時(shí)有大些的實(shí)例(象 GIS 中的Geometry),為了優(yōu)化程序性能,你也可以通過實(shí)現(xiàn)該接口讓客戶調(diào)用端在確認(rèn)不需要這些對象時(shí)手工釋放它們

示例:

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4.  

  5. namespace Example20 {   

  6. class Program {   

  7. class Class1 : IDisposable {   

  8. //析構(gòu)函數(shù),編譯后變成 protected void Finalize(),
    GC會在回收對象前會調(diào)用調(diào)用該方法~Class1(){  

  9. Dispose(false);  

  10. }  

  11.  

  12. //通過實(shí)現(xiàn)該接口,客戶可以顯式地釋放對象,而不需要等待GC來釋放資源,
    據(jù)說那樣會降低效率void IDisposable.Dispose(){   

  13. Dispose(true);  

  14. }  

  15.  

  16. //將釋放非托管資源設(shè)計(jì)成一個(gè)虛函數(shù),提供在繼承類中釋放基類的資源的能力

  17. protected virtual void ReleaseUnmanageResources({  

  18. //Do something……  

  19. }  

  20. //私有函數(shù)用以釋放非托管資源private void Dispose(bool disposing){   

  21. ReleaseUnmanageResources();  

  22. //為true時(shí)表示是客戶顯式調(diào)用了釋放函數(shù),需通知GC不要再調(diào)用對象的Finalize方法  

  23. //為false時(shí)肯定是GC調(diào)用了對象的Finalize方法,
    所以沒有必要再告訴GC你不要調(diào)用我的Finalize方法啦if (disposing{  

  24. GC.SuppressFinalize(this);} static void Main(string[] args){   

  25. //tmpObj1沒有手工釋放資源,就等著GC來慢慢的釋放它吧Class1 tmpObj1 = new Class1();  

  26. //tmpObj2調(diào)用了Dispose方法,傳說比等著GC來釋放它效率要調(diào)一些  

  27. //個(gè)人認(rèn)為是因?yàn)橐饌€(gè)對象的查看其元數(shù)據(jù),以確認(rèn)是否實(shí)現(xiàn)了Dispose方法吧  

  28. //當(dāng)然最重要的是我們可以自己確定釋放的時(shí)間以節(jié)省內(nèi)存,優(yōu)化程序運(yùn)行效率  

  29. Class1 tmpObj2 = new Class1()((IDisposable)tmpObj2)。Dispose();  

C#學(xué)習(xí)經(jīng)驗(yàn)之P/Invoke是什么?

在受控代碼與非受控代碼進(jìn)行交互時(shí)會產(chǎn)生一個(gè)事務(wù)(transition) ,這通常發(fā)生在使用平臺調(diào)用服務(wù)(Platform Invocation Services),即P/Invoke

如調(diào)用系統(tǒng)的 API 或與 COM 對象打交道,通過 System.Runtime.InteropServices 命名空間,雖然使用 Interop 非常方便,但據(jù)估計(jì)每次調(diào)用事務(wù)都要執(zhí)行 10 到 40 條指令,算起來開銷也不少,所以我們要盡量少調(diào)用事務(wù),如果非用不可,建議本著一次調(diào)用執(zhí)行多個(gè)動作,而不是多次調(diào)用每次只執(zhí)行少量動作的原則。

C#學(xué)習(xí)經(jīng)驗(yàn)之StringBuilder 和 String 的區(qū)別?

String 雖然是一個(gè)引用類型,但在賦值操作時(shí)會產(chǎn)生一個(gè)新的對象,而 StringBuilder 則不會,所以在大量字符串拼接或頻繁對某一字符串進(jìn)行操作時(shí)***使用 StringBuilder,不要使用 String

示例:

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4.  

  5. namespace Example22 {  

  6. class Program {   

  7. static void Main(string[] args){   

  8. const int cycle = 100000;  

  9.  

  10. long vTickCount = Environment.TickCount;  

  11. String str = null;  

  12. for (int i = 0; i < cycle; i++)  

  13.  

  14. str += i.ToString();  

  15. Console.WriteLine
    ("String: {0} MSEL", Environment.TickCount - vTickCount);  

  16.  

  17. vTickCount = Environment.TickCount;  

  18. //看到這個(gè)變量名我就生氣,奇怪為什么大家都使它呢? :)  

  19.  

  20. StringBuilder sb = new StringBuilder();  

  21. for (int i = 0; i < cycle; i++)  

  22.  

  23. sb.Append(i);  

  24. Console.WriteLine
    ("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);  

  25.  

  26. Console.ReadLine();  

到此,關(guān)于“C#中如何釋放非托管資源”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


本文題目:C#中如何釋放非托管資源
網(wǎng)頁鏈接:http://weahome.cn/article/pjhdsd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部