成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#學(xué)習(xí)經(jīng)驗(yàn)總結(jié)

開發(fā) 后端
本文介紹C#學(xué)習(xí)經(jīng)驗(yàn),包括如何釋放非托管資源、P/Invoke是什么和StringBuilder 和 String 的區(qū)別等方面介紹。

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

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

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

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

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

另外補(bǔ)充一句,這種實(shí)現(xiàn)并不一定要使用了非托管資源后才用,如果你設(shè)計(jì)的類會(huì)在運(yùn)行時(shí)有大些的實(shí)例(象 GIS 中的Geometry),為了優(yōu)化程序性能,你也可以通過實(shí)現(xiàn)該接口讓客戶調(diào)用端在確認(rèn)不需要這些對(duì)象時(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會(huì)在回收對(duì)象前會(huì)調(diào)用調(diào)用該方法~Class1(){  
  9. Dispose(false);  
  10. }  
  11.  
  12. //通過實(shí)現(xiàn)該接口,客戶可以顯式地釋放對(duì)象,而不需要等待GC來釋放資源,
    據(jù)說那樣會(huì)降低效率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)用對(duì)象的Finalize方法  
  23. //為false時(shí)肯定是GC調(diào)用了對(duì)象的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è)對(duì)象的查看其元數(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í)會(huì)產(chǎn)生一個(gè)事務(wù)(transition) ,這通常發(fā)生在使用平臺(tái)調(diào)用服務(wù)(Platform Invocation Services),即P/Invoke

如調(diào)用系統(tǒng)的 API 或與 COM 對(duì)象打交道,通過 System.Runtime.InteropServices 命名空間,雖然使用 Interop 非常方便,但據(jù)估計(jì)每次調(diào)用事務(wù)都要執(zhí)行 10 到 40 條指令,算起來開銷也不少,所以我們要盡量少調(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è)引用類型,但在賦值操作時(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.  
  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();  

【編輯推薦】

  1. C#結(jié)構(gòu)體的特點(diǎn)淺析
  2. 介紹C#窗體拖動(dòng)事件
  3. C#讀取Excel遇到無法讀取的解決方法
  4. 概述C#.NET操作XML
  5. C#基礎(chǔ)概念學(xué)習(xí)筆記
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2009-08-11 14:20:41

C# .NET學(xué)習(xí)經(jīng)驗(yàn)

2009-09-01 13:10:39

C#讀取Word

2009-08-07 09:47:17

C#枚舉C#數(shù)組

2009-08-21 17:42:36

C#調(diào)用API

2009-08-24 14:56:01

C#連接Access

2009-09-02 14:14:44

C# COM接口轉(zhuǎn)換

2009-08-27 11:21:36

C# override

2009-09-18 10:21:13

C#數(shù)組C#串操作

2009-09-01 13:00:05

C#實(shí)現(xiàn)Windows

2009-09-03 13:48:20

C#實(shí)現(xiàn)Web服務(wù)器功

2009-09-16 17:13:54

學(xué)習(xí)Linq

2009-08-27 15:45:30

C#正則表達(dá)式

2011-07-21 13:40:17

java

2013-12-18 15:54:21

2010-06-13 13:44:07

UML學(xué)習(xí)筆記

2011-07-08 13:15:52

JSP

2009-08-26 15:39:08

C#隱式類型局部變量

2010-06-02 09:06:26

SVN學(xué)習(xí)

2009-10-15 09:27:00

2010-02-02 15:44:18

C++遍歷集合
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品国产美女在线观看 | 亚洲电影在线播放 | 五月婷婷视频 | 国产成人精品午夜 | 亚洲精选久久 | 在线播放亚洲 | 国产精品久久久久久久免费观看 | 亚洲欧美一区二区三区1000 | 成年人在线视频 | 国产精品99久久久久久久久久久久 | 久久亚洲一区 | 国产精品极品美女在线观看免费 | 日韩成人免费av | 91中文视频 | 91国自产 | 国产又色又爽又黄又免费 | 午夜精品一区二区三区免费视频 | 91小视频在线 | 日韩一二三区视频 | 密室大逃脱第六季大神版在线观看 | 成人国产精品色哟哟 | 精品区| 亚洲一区自拍 | 91精品国产综合久久久密闭 | 欧美vide| 欧美区日韩区 | 久久大香 | 91免费在线看 | 欧美一区免费 | 欧美午夜影院 | 国产视频二区在线观看 | 成人一区二区三区在线观看 | 久热久热 | 久久久91| 久久天堂网 | 欧美精品一区二区三区四区五区 | 黄色网址在线免费观看 | 欧美极品少妇xxxxⅹ免费视频 | 国产91在线 | 中日 | 围产精品久久久久久久 | 成人3d动漫一区二区三区91 |