日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#學(xué)習(xí)經(jīng)驗(yàn)總結(jié)

C#學(xué)習(xí)經(jīng)驗(yàn)之如何釋放非托管資源?

成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元尤溪做網(wǎng)站,已為上家服務(wù),為尤溪各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

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

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

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

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

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

示例:

 
 
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Example20 { 
  5. class Program { 
  6. class Class1 : IDisposable { 
  7. //析構(gòu)函數(shù),編譯后變成 protected void Finalize(),
    GC會(huì)在回收對(duì)象前會(huì)調(diào)用調(diào)用該方法~Class1(){
  8. Dispose(false);
  9. }
  10. //通過(guò)實(shí)現(xiàn)該接口,客戶可以顯式地釋放對(duì)象,而不需要等待GC來(lái)釋放資源,
    據(jù)說(shuō)那樣會(huì)降低效率void IDisposable.Dispose(){ 
  11. Dispose(true);
  12. }
  13. //將釋放非托管資源設(shè)計(jì)成一個(gè)虛函數(shù),提供在繼承類(lèi)中釋放基類(lèi)的資源的能力
  14. protected virtual void ReleaseUnmanageResources({
  15. //Do something……
  16. }
  17. //私有函數(shù)用以釋放非托管資源private void Dispose(bool disposing){ 
  18. ReleaseUnmanageResources();
  19. //為true時(shí)表示是客戶顯式調(diào)用了釋放函數(shù),需通知GC不要再調(diào)用對(duì)象的Finalize方法
  20. //為false時(shí)肯定是GC調(diào)用了對(duì)象的Finalize方法,
    所以沒(méi)有必要再告訴GC你不要調(diào)用我的Finalize方法啦if (disposing{
  21. GC.SuppressFinalize(this);} static void Main(string[] args){ 
  22. //tmpObj1沒(méi)有手工釋放資源,就等著GC來(lái)慢慢的釋放它吧Class1 tmpObj1 = new Class1();
  23. //tmpObj2調(diào)用了Dispose方法,傳說(shuō)比等著GC來(lái)釋放它效率要調(diào)一些
  24. //個(gè)人認(rèn)為是因?yàn)橐饌€(gè)對(duì)象的查看其元數(shù)據(jù),以確認(rèn)是否實(shí)現(xiàn)了Dispose方法吧
  25. //當(dāng)然最重要的是我們可以自己確定釋放的時(shí)間以節(jié)省內(nèi)存,優(yōu)化程序運(yùn)行效率
  26. Class1 tmpObj2 = new Class1()((IDisposable)tmpObj2)。Dispose();
  27. }

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

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

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

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

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

示例:

 
 
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Example22 {
  5. class Program { 
  6. static void Main(string[] args){ 
  7. const int cycle = 100000;
  8. long vTickCount = Environment.TickCount;
  9. String str = null;
  10. for (int i = 0; i < cycle; i++)
  11. str += i.ToString();
  12. Console.WriteLine
    ("String: {0} MSEL", Environment.TickCount - vTickCount);
  13. vTickCount = Environment.TickCount;
  14. //看到這個(gè)變量名我就生氣,奇怪為什么大家都使它呢? :)
  15. StringBuilder sb = new StringBuilder();
  16. for (int i = 0; i < cycle; i++)
  17. sb.Append(i);
  18. Console.WriteLine
    ("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);
  19. Console.ReadLine();
  20. }

文章名稱:C#學(xué)習(xí)經(jīng)驗(yàn)總結(jié)
鏈接URL:http://www.dlmjj.cn/article/coocphc.html