青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 67  文章 - 171  trackbacks - 0
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(10)

隨筆分類

隨筆檔案

連接資料

最新隨筆

搜索

  •  

最新隨筆

最新評(píng)論

最近看到了C++/CLI這門新技術(shù),但一直不知道這個(gè)東西重要不?應(yīng)用廣泛不?希望大家指點(diǎn)。順便轉(zhuǎn)一些東西給大家看!



C++/CLI
  什么是C++/CLI呢?C++當(dāng)然指的是Bjarne Stroustrup在BELL實(shí)驗(yàn)室發(fā)明的C++語(yǔ)言,它實(shí)現(xiàn)了運(yùn)行時(shí)取得速度和尺寸最佳化的靜態(tài)對(duì)象模型,然而它除了堆分配外不支持程序的動(dòng)態(tài)修改,它準(zhǔn)許無(wú)限地接近底層設(shè)備,但在程序運(yùn)行過(guò)程中幾乎無(wú)法操作活動(dòng)類型,也無(wú)法操作與程序相關(guān)聯(lián)的底層結(jié)構(gòu)。Herb Sutter,C++/CLI的主要構(gòu)造者之一,稱C++是一門“混凝土”式的語(yǔ)言。

  CLI指的是通用語(yǔ)言結(jié)構(gòu),一種支持動(dòng)態(tài)組件編程模型的多重結(jié)構(gòu),在許多情況下,這代表了一個(gè)與C++對(duì)象模型完全顛倒了的模式。一個(gè)時(shí)實(shí)的軟件層,有效地執(zhí)行系統(tǒng),在底層操作系統(tǒng)與程序之間運(yùn)行。操作底層的設(shè)備受到一定的限制,操作執(zhí)行程序中的活動(dòng)類型及與程序相關(guān)聯(lián)的下部結(jié)構(gòu)得到了支持。反斜杠(/)代表C++和CLI的捆綁,這個(gè)捆綁帶來(lái)的細(xì)節(jié)問(wèn)題是本文主要討論的問(wèn)題。

  所以,“什么是C++/CLI”問(wèn)題的最初、最接近答案是:它是靜態(tài)C++對(duì)象模型到CLI的動(dòng)態(tài)組件對(duì)象編程模型的捆綁。簡(jiǎn)而言之,它就是你如何用C++在.NET中編程,而不是C#或Visual Basic.NET。象C#和CLI本身一樣,C++/CLI正在ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))主持下進(jìn)行標(biāo)準(zhǔn)化,以最終符合ISO標(biāo)準(zhǔn)。

  實(shí)時(shí)通用語(yǔ)言(CLR)是CLI的微軟版本,它非常適用于微軟的Windows操作系統(tǒng),相似地,Visual C++2005是C++/CLI的實(shí)現(xiàn)。

  作為第二個(gè)近似的答案,我認(rèn)為C++/CLI是.NET編程模式與C++的結(jié)合,正如以前將模板與C++結(jié)合起來(lái)產(chǎn)生的泛型編程。所有這種結(jié)合中,企業(yè)所擁有的C++的投資以及開(kāi)發(fā)人員使用C++的經(jīng)驗(yàn)將得到保存,而這恰恰是使用C++/CLI進(jìn)行開(kāi)發(fā)的重要基礎(chǔ)。

  學(xué)習(xí)C++/CLI的方法

  在設(shè)計(jì)C++/CLI語(yǔ)言中涉及三個(gè)方面問(wèn)題,這同樣貫徹于所有的其他程序開(kāi)發(fā)語(yǔ)言:一是語(yǔ)言級(jí)的語(yǔ)法向底層通用類型系統(tǒng)(簡(jiǎn)稱CTS)的映射;二是向程序開(kāi)發(fā)人員提供的CLI的底層細(xì)節(jié)結(jié)構(gòu)的級(jí)別選擇;三是超越CLI的直接支持,提供額外的功能性函數(shù)的選擇。

  第一條對(duì)于所有的CLI語(yǔ)言來(lái)說(shuō)都大致相同,第二條和第三條對(duì)于不同的CLI語(yǔ)言來(lái)說(shuō)是不同的,相互區(qū)別的。根據(jù)你需要解決什么樣的問(wèn)題,你將選擇這種或那種語(yǔ)言,也有可能混合使用多種CLI語(yǔ)言。學(xué)習(xí)C++/CLI涉及到了解它在設(shè)計(jì)過(guò)程中的所有這些涉及方面。

  從C++/CLI到CTS的映射?

  使用C++/CLI編程時(shí)間了解底層的CTS非常重要。CTS包括以下三種常用類的類型:
  1、多態(tài)引用類型,這正是對(duì)于所有繼承類所要使用的。
  2、非多態(tài)值類型,這用于實(shí)時(shí)高效的具體類型,例如數(shù)值類型。
  3、抽象的接口類型,這用于定義一個(gè)操作集,也可以用于實(shí)現(xiàn)接口的引用或值類型集合。
  這個(gè)設(shè)計(jì)方面的問(wèn)題,即將CTS映射到語(yǔ)言內(nèi)建的數(shù)據(jù)類型集合,通常同樣貫穿于所有的CLI語(yǔ)言,雖然不同的CLI語(yǔ)言語(yǔ)法不同。所以,在C#中你可能這么寫:

abstract class Shape { ... } // C#

  來(lái)定義了一個(gè)Shape基類,從該類將導(dǎo)出幾何對(duì)象,然而在C++/CLI你將這么寫:

ref class Shape abstract { ... }; // C++/CLI

  上述代碼說(shuō)明了底層的C++/CLI引用類型。這兩種聲明在內(nèi)層代表的意思是一樣的。相似地,在C#中你這么寫:

struct Point2D { ... } // C#

  來(lái)定義一個(gè)具體的Point2D 類,然而在C++/CLI中這么寫:

value class Point2D { ... }; // C++/CLI

  C++/CLI支持的類型集合代表了CTS與本地設(shè)備的綜合,這決定了你的語(yǔ)法選擇,例如:

class native {};
value class V {};
ref class R {};
interface class I {};

  CTS也支持與本地列舉類型稍微不同的列舉類類型。當(dāng)然,對(duì)于上述兩者CTS是都支持的。例如:

enum native { fail, pass };
enum class CLIEnum : char { fail, pass};

  相似地,CTS支持它本身的數(shù)組類型,并且它再一次將其與本地?cái)?shù)組在行為上區(qū)分開(kāi)來(lái)。同時(shí),微軟再次為這兩種類型提供了支持。

int native[] = { 1,1,2,3,5,8 };
array<int>^ managed = { 1,1,2,3,5,8 };

  那種認(rèn)為一種CLI語(yǔ)言比其他CLI語(yǔ)言在向底層的CTS映射中表現(xiàn)的更出色或更完美都是不確切的,相反,每種不同的CLI語(yǔ)言代表著對(duì)CTS底層對(duì)象模型的不同理解,在下一節(jié)你將更清楚地看到這一點(diǎn)。

  CLI的細(xì)節(jié)

  設(shè)計(jì)一個(gè)CLI語(yǔ)言時(shí)第二個(gè)必須要考慮的問(wèn)題是將CLI的底層執(zhí)行模式融入到語(yǔ)言的細(xì)節(jié)級(jí)別。這種語(yǔ)言用于解決什么問(wèn)題?這種語(yǔ)言是否有必須的工具來(lái)解決這些問(wèn)題?這種語(yǔ)言可能吸引什么樣的程序開(kāi)發(fā)人員?
  例如,值類型存在于托管堆上,在很多情況下值類型可以看到它們自身的存在。
  1、通過(guò)隱含的加箱操作,當(dāng)一個(gè)值類型的實(shí)例被分配給一個(gè)對(duì)象或當(dāng)一個(gè)虛擬的方法通過(guò)一個(gè)值類型來(lái)調(diào)用;
  2、當(dāng)這個(gè)值類型被當(dāng)作應(yīng)用引用類類型的成員時(shí);
  3、當(dāng)這個(gè)值類型 被當(dāng)作CLI數(shù)組成員時(shí);
  需要指出的是,這種情況下開(kāi)發(fā)人員是否被允許操作值類型的地址是CLI語(yǔ)言設(shè)計(jì)時(shí)必須應(yīng)該予以考慮的問(wèn)題。

  存在的問(wèn)題

  在垃圾收集器掃描緊縮狀態(tài)下,位于托管堆上的任何對(duì)象非常可能面對(duì)重新定位問(wèn)題。指向?qū)ο蟮闹羔樋梢詫?shí)時(shí)跟蹤并修改。開(kāi)發(fā)人員不能自己手動(dòng)跟蹤,所以,如果你獲許取得一個(gè)可能位于托管堆上的值類型的地址時(shí),除了本地指針外,還需要有一個(gè)跟蹤形態(tài)的指針。

  銷售商考慮的是什么?那就是需要簡(jiǎn)單和安全,在語(yǔ)言中直接提供跟蹤一個(gè)對(duì)象或集合的指針使語(yǔ)言復(fù)雜化,沒(méi)有這種支持,將減少?gòu)?fù)雜程度,可資利用的、潛在的程序開(kāi)發(fā)人群可能會(huì)增加,此外,準(zhǔn)許程序開(kāi)發(fā)人員操作生命短暫的值類型,增加了錯(cuò)誤產(chǎn)生的可能性,程序開(kāi)發(fā)人員可能有意無(wú)意地對(duì)內(nèi)存進(jìn)行錯(cuò)誤操作,不支持跟蹤指針,一個(gè)潛在的更安全地實(shí)時(shí)環(huán)境產(chǎn)生了。

  另一方面,效率和靈活性也是必須考慮的一個(gè)問(wèn)題,每一次向同一個(gè)對(duì)象分配值類型時(shí),一個(gè)全新的數(shù)值加箱操作發(fā)生了,準(zhǔn)許存取加箱值類型允許在內(nèi)存中進(jìn)行更新,這可能在性能上產(chǎn)生了一個(gè)非常巨大的進(jìn)步。沒(méi)有跟蹤形態(tài)的指針,你無(wú)法用指針?biāo)惴ㄖ匦侣暶饕粋€(gè)CLI數(shù)組,這意味著CLI數(shù)組不能使用標(biāo)準(zhǔn)模板庫(kù)進(jìn)行重新聲明,也不能使用一般的算法。準(zhǔn)許操作加箱數(shù)值使設(shè)計(jì)具有更大地靈活性。

  微軟在C++/CLI中選擇地址集合模式來(lái)處理托管堆上的值類型。

int ival = 1024;
int^ boxedi = ival;
array<int>^ ia = gcnew array<int>{1,1,2,3,5,8};
interior_ptr<int> begin = &ia[0];
value struct smallInt { int m_ival; ... } si;
pin_ptr<int> ppi = &si.m_ival;

  典型地C++/CLI開(kāi)發(fā)人員是一個(gè)復(fù)雜的系統(tǒng)程序員,承擔(dān)著提供下層內(nèi)部構(gòu)造和有組織的應(yīng)用程序的任務(wù),而這些恰恰是未來(lái)商業(yè)發(fā)展的基礎(chǔ)。C++/CLI開(kāi)發(fā)人員必須兼顧可測(cè)量性和可執(zhí)行性,所以必須在系統(tǒng)的高度級(jí)上來(lái)看待CLI下層結(jié)構(gòu)。CLI細(xì)節(jié)水平反映了開(kāi)發(fā)人員的臉色。

  復(fù)雜性本身并不代表對(duì)質(zhì)量的否定,人類比單細(xì)胞細(xì)菌復(fù)雜的多,這當(dāng)然不是一件壞事,然而,當(dāng)表達(dá)一個(gè)簡(jiǎn)單的概念變的復(fù)雜化后,這常常被認(rèn)為是一件壞事。在C++/CLI中,CLI開(kāi)發(fā)團(tuán)隊(duì)已經(jīng)試著提供一種精巧的方法來(lái)表達(dá)方式一個(gè)復(fù)雜的事情。

  額外增加的功能

  第三個(gè)設(shè)計(jì)方面是特定功能性的語(yǔ)言層,它遠(yuǎn)遠(yuǎn)超過(guò)CLI所提供的直接支持,雖然這可能需要在語(yǔ)言層支持和CLI底層執(zhí)行模式間建立一個(gè)映射。但在某些情況下,這恰恰是不可能的,因?yàn)檎Z(yǔ)言無(wú)法調(diào)節(jié)CLI的行為。這種情況的例子就是在基類的構(gòu)造及析構(gòu)函數(shù)中定義虛函數(shù)。根據(jù)ISO-C++在這種情況下的語(yǔ)言學(xué),需要用每一個(gè)基類的構(gòu)造和虛構(gòu)函數(shù)重新設(shè)置虛擬表,而這是不可能的,因?yàn)樘摂M表句柄是實(shí)時(shí)管理的,而不是某一個(gè)語(yǔ)言來(lái)管理。

  所以,這個(gè)設(shè)計(jì)方面是在完美性和可行性之間的妥協(xié)產(chǎn)物,C++/CLI提供的額外功能主要表現(xiàn)在三個(gè)方面:

  1、獲取資源的一種形式是對(duì)于引用類型的初始化,此外,提供一種自動(dòng)化工具,用于占用較少資源、所謂的可確定性自動(dòng)消亡的垃圾收集類型對(duì)象。
  2、一種深度拷貝形式的語(yǔ)法與C++拷貝構(gòu)造函數(shù)和拷貝分配操作符相一致,但其并不適用與值類型。
  3、除了最初的一般性CLI機(jī)制外,還有對(duì)于CTS類型的C++模板直接支持。這些是我第一篇文章中討論的主題。此外,還提供了針對(duì)CLI類型的可校驗(yàn)STL版本。

  讓我們來(lái)看一個(gè)簡(jiǎn)單的例子,一個(gè)確定性消亡問(wèn)題。在垃圾搜集器重新聲明一塊與對(duì)象相關(guān)聯(lián)的內(nèi)存之前,一個(gè)相關(guān)的消亡方法,如果存在的話,將被調(diào)用。你可以認(rèn)為這種方法是超級(jí)析構(gòu)函數(shù),因?yàn)樗c對(duì)象的程序生命期無(wú)關(guān)。這就叫做終結(jié)。終結(jié)函數(shù)是否調(diào)用以及什么時(shí)間調(diào)用都沒(méi)有明確規(guī)定,這就是垃圾收集器的非確定性終結(jié)。

  在動(dòng)態(tài)內(nèi)存管理的情況下,非確定性終結(jié)工作非常好,當(dāng)可用內(nèi)存變的越來(lái)越少時(shí),垃圾收集器介入并開(kāi)始著手解決問(wèn)題。然而,非決定性終結(jié)也有工作不好的時(shí)候,當(dāng)一個(gè)對(duì)象維護(hù)一個(gè)重要資源,例如一個(gè)數(shù)據(jù)庫(kù)連接、鎖定某些類別、或者可能是本地的堆內(nèi)存。在這種情況下,只要是不需要,應(yīng)立即釋放資源。目前CLI所支持的解決問(wèn)題的方法是,對(duì)于一個(gè)類通過(guò)執(zhí)行IDisposable接口提供的Dispose方法釋放資源。這里的問(wèn)題是執(zhí)行Dispose方法需要一個(gè)清晰的聲明,所以它也就不可能存在調(diào)用。

  最基本的C++中的設(shè)計(jì)模式是上述的通過(guò)初始化來(lái)獲取資源,這意味著類使用構(gòu)造函數(shù)來(lái)獲取資源,相反,類使用析構(gòu)函數(shù)來(lái)釋放資源。這些行為由類對(duì)象在生存期內(nèi)自動(dòng)管理。

  下面是引用類釋放資源時(shí)所做的順序動(dòng)作:
  1、 首先使用析構(gòu)函數(shù)來(lái)封裝所有與釋放類有關(guān)的資源時(shí)所必須的代碼;
  2、 析構(gòu)函數(shù)自動(dòng)調(diào)用后,結(jié)束類對(duì)象的生命期。

  對(duì)于引用類型來(lái)說(shuō),CLI沒(méi)有類析構(gòu)函數(shù)的概念,所以析構(gòu)函數(shù)不得不映射為在底層執(zhí)行的其它代碼。此時(shí),在內(nèi)部,編譯器執(zhí)行以下操作:
  1、 類讓其基類列表繼承自IDisposable接口;
  2、 析構(gòu)函數(shù)轉(zhuǎn)換成IDisposable的Dispose方法。

  以上實(shí)現(xiàn)了目標(biāo)的一半,一種實(shí)現(xiàn)析構(gòu)造函數(shù)自動(dòng)調(diào)用的方法仍然需要,對(duì)于引用類型,一種特殊的基于棧的符號(hào)得到支持,也就是說(shuō),一個(gè)對(duì)象的生命期與它的聲明范圍有關(guān)。在內(nèi)部,編譯器將符號(hào)轉(zhuǎn)換為在托管堆上分配引用對(duì)象。隨著作用域的終結(jié),編譯器插入一個(gè)Dispose方法-用戶定義的析構(gòu)函數(shù)。與對(duì)象有關(guān)的內(nèi)存的收回在垃圾收集器的控制下得到執(zhí)行。

  C++/CLI并不是將C++拓展到一個(gè)托管的世界,更確切的說(shuō),它代表一個(gè)完全綜合的范例,某種程度上就象當(dāng)初將泛編程模式和多重繼承綜合進(jìn)該語(yǔ)言一樣。我認(rèn)為C++/CLI開(kāi)發(fā)小組做了一項(xiàng)非常卓有成效的工作。

  小結(jié)

  C++/CLI代表托管和本地編程的結(jié)合。在反復(fù)過(guò)程中,這種綜合已經(jīng)通過(guò)源級(jí)相對(duì)獨(dú)立但又相互平等地組件和二進(jìn)制元素得到了完成,包括混合模式(本地和CTS類型的源級(jí)混合,還有一個(gè)本地及CLI對(duì)象文件的二進(jìn)制混合),純模式(本地和CTS類型的源代碼級(jí)混合,所有的都被編譯為CLI對(duì)象文件),本地分類(可以通過(guò)一個(gè)特定的打包類來(lái)保持CTS類型),和CTS分類(可以保持本地類型為指針)。

  當(dāng)然,C++/CLI開(kāi)發(fā)人員也可以單獨(dú)使用CLI類型來(lái)編程,并通過(guò)這種方式來(lái)提供伺服狀態(tài)下的可校驗(yàn)代碼,例如可以作為SQL Server2005的一個(gè)SQL存儲(chǔ)過(guò)程。

  現(xiàn)在,還是回到這個(gè)問(wèn)題上來(lái),什么是C++/CLI?它是進(jìn)行.NET編程模式的最佳切入點(diǎn)。對(duì)于C++/CLI,有一個(gè)來(lái)自C++的遷移路徑,它不僅包含C++的底層基礎(chǔ),而且也需要C++編程經(jīng)驗(yàn),對(duì)于這些,我感到非常滿意。

C++/CLICLI:Common Language Infrastructure)是一門用來(lái)代替C++托管擴(kuò)展(下文使用MC++指代)新的語(yǔ)言規(guī)范。重新簡(jiǎn)化了C++托管擴(kuò)展的語(yǔ)法,提供了更好的代碼可讀性。和微軟.NET的其他語(yǔ)言一樣,微軟向ECMA提交了C++/CLI的標(biāo)準(zhǔn)。C++/CLI現(xiàn)在可以在Visual C++ 2005上開(kāi)發(fā)。C++/CLI的部分特性已經(jīng)申請(qǐng)了專利

1 語(yǔ)法改變

C++/CLI是一門獨(dú)立的語(yǔ)言(比如新的關(guān)鍵字),而不是像C++托管擴(kuò)展一樣是C++的超集 (C++托管擴(kuò)展有一些不標(biāo)志的關(guān)鍵字如__gc和__value)。所以,C++/CLI對(duì)于這些語(yǔ)法有較大的改變,尤其是去除了一些意義不明確的關(guān)鍵字,增加了一些.NET的特性.

很多不一致的語(yǔ)法,像MC++的不同版本用法的操作符new()被區(qū)分開(kāi):在C++/CLI,.NET引用類型的創(chuàng)建要使用新的關(guān)鍵字gcnew。并且C++/CLI增加了新的泛型概念(與C++ templates相似,但還是有很大的區(qū)別)。

1.1 句柄(Handle)

回到MC++,有兩類指針: 用__nogc標(biāo)識(shí)的指針是傳統(tǒng)意義上的C++指針,而用__gc標(biāo)識(shí)的指針為.NET中的引用。但在C++/CLI里,唯一的指針就是傳統(tǒng)意義上的C++指針,而.NET引用類型使用一個(gè)“句柄”來(lái)獲取,使用新的語(yǔ)法“類名^”代替了MC++的“類名*”。新的句法使得托管和非托管代碼混合開(kāi)發(fā)更加方便;它指明了對(duì)象將會(huì)被垃圾回收器自動(dòng)銷毀還是手動(dòng)銷毀。

范例代碼:

// C++托管擴(kuò)展
#using <mscorlib.dll>
using namespace System::Collections;
__gc class referencetype
{
protected:
String* stringVar;
int intArr __gc[];
ArrayList* doubleList;
public:
referencetype(String* str,int* pointer,int number) // 哪個(gè)是托管的?
{
doubleList = new ArrayList();
System::Console::WriteLine(str->Trim() + number.ToString());
}
};

// C++/CLI
#using <mscorlib.dll>
using namespace System::Collections::Generic;
ref class referencetype
{
protected:
String^ stringVar;
array<int> intArr;
List<double>^ doubleList;
public:
referencetype(String^ str,int* pointer,int number) // 不會(huì)再分不清了吧?
{
doubleList = gcnew List<double>();
System::Console::WriteLine(str->Trim() + number);
}
};

1.2 跟蹤引用(Tracking reference)

C++/CLI里的一個(gè)“跟蹤引用”也是一個(gè)句柄,但它是傳地址而不是傳值。等同于在C#中加了“ref”關(guān)鍵字,或Visual Basic .NET的“ByRef”。C++/CLI使用“^%”語(yǔ)法來(lái)定義一個(gè)跟蹤引用。與傳統(tǒng)C++中的“*&”語(yǔ)法相似。

下面的示例了“跟蹤引用”的使用。如果把“^%”改成“^”(也就是使用普通的句柄),10個(gè)字符串將不會(huì)被修改,而只會(huì)生成那些字符串的副本,這些都是因?yàn)槟切┮靡呀?jīng)不是傳地址而是傳值。

int main()
{
array<String^>^ arr = gcnew array<String^>(10);
int i = 0;

for each(String^% s in arr)
s = gcnew String(i++.ToString());

return 0;
}

上面的代碼示例了用戶如何用C++/CLI做一些其他.NET語(yǔ)言不能做的事情,比如C#就不允許在foreach循環(huán)中這樣做。例如foreach(ref string s in arr)在C#中是非法的。


1.3 析構(gòu)(Finalizer/Destructor)

C++/CLI的另一個(gè)變化就是使用“!類名()”來(lái)聲明一個(gè)托管類型的“析構(gòu)方法”(在垃圾回收器回收對(duì)象之前的不確定的時(shí)間由CLR調(diào)用),而原來(lái)的“~類名()”是用來(lái)定義“傳統(tǒng)的析構(gòu)函數(shù)”(能被用戶自己調(diào)用)。另外,下面的例子說(shuō)明了如何在C++/CLI中托管對(duì)象如何自動(dòng)調(diào)用“傳統(tǒng)析構(gòu)函數(shù)”。

在一個(gè)典型的.NET程序中(例如直接使用CIL)編程,可以由用戶自己調(diào)用的“析構(gòu)方法”是用實(shí)現(xiàn)IDisposable接口,通過(guò)編寫Dispose方法來(lái)實(shí)現(xiàn)顯式釋放資源;而不確定的“析構(gòu)方法”是通過(guò)重載Finalize函數(shù)來(lái)實(shí)現(xiàn)的。

// C++/CLI
ref class MyClass // :IDisposable (編譯器自動(dòng)實(shí)現(xiàn)IDisposable接口)
{
public:
MyClass(); // 構(gòu)造函數(shù)
~MyClass(); // (確定的) 析構(gòu)函數(shù) (編譯器使用IDisposable.Dispose來(lái)實(shí)現(xiàn))
protected:
!MyClass(); // 析構(gòu)方法 (不確定的) (編譯器通過(guò)重載virtual void Finalize來(lái)實(shí)現(xiàn))
public:
static void Test()
{
MyClass auto; // 這不是個(gè)句柄,它將調(diào)用MyClass的默認(rèn)構(gòu)造函數(shù)
// 使用auto對(duì)象
// 函數(shù)返回前自動(dòng)調(diào)用auto的析構(gòu)函數(shù)(IDisposable.Dispose,由~MyClass()定義)來(lái)釋放資源
// 以上代碼等效于:
MyClass^ user = gcnew MyClass();
try { /* 使用auto對(duì)象 */ }
finally { delete user; /* 由編譯器調(diào)用auto.Dispose() */ }
}
};

// C#
class MyClass : IDisposable
{
public MyClass() {} // 構(gòu)造函數(shù)
~MyClass() {} // 析構(gòu)方法 (不確定的) (編譯器通過(guò)重載virtual void Finalize來(lái)實(shí)現(xiàn)),與C++/CLI的!MyClass()等效
public void Dispose() {} // Dispose方法
public static void Test()
{
using(MyClass auto = new MyClass())
{ /* 使用auto對(duì)象 */ }
// 因?yàn)槭褂昧藆sing句法,編譯器自動(dòng)調(diào)用auto.Dispose()
// 以上代碼等效于:
MyClass user = new MyClass();
try { /* 使用user對(duì)象 */ }
finally { user.Dispose(); }
}
}




posted on 2008-07-13 12:29 cpsprogramer 閱讀(3182) 評(píng)論(13)  編輯 收藏 引用 所屬分類: VC++

FeedBack:
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-13 13:20 zzzzzzzz
樓主呀,不要在C++/Cli上浪費(fèi)青春了,好好研究一下標(biāo)準(zhǔn)C++吧  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-13 16:12 葉付海的C++
@zzzzzzzz
此話怎么說(shuō)呢?  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-13 16:31 斯卡
看不懂那  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-13 17:19 夢(mèng)在天涯
CLIC++在實(shí)際的使用中并不多用,就我們的實(shí)際開(kāi)發(fā)中唯一要使用這個(gè)的地方就是實(shí)現(xiàn)C++和C#語(yǔ)言的互調(diào)!

作為初學(xué)者,我覺(jué)的沒(méi)有必要研究,精通一門語(yǔ)言就最重要的啊!


CLIC++其實(shí)就是C++加C#,實(shí)現(xiàn)了既可以調(diào)用底層系統(tǒng)API,也可以使用。net framework提供大量的庫(kù)。但是以前的2門語(yǔ)言,現(xiàn)在一門要實(shí)現(xiàn),那自然語(yǔ)法什么都有些復(fù)雜,也難免有點(diǎn)別扭,所以這也正是很多的C++和C#的開(kāi)發(fā)者都不愿意去學(xué)習(xí)CLIC++。

以前沒(méi)有CLIC++的時(shí)候,我們都是從C++轉(zhuǎn)向C#,現(xiàn)在有了CLIC++以后,如果想要使用。net framework就可以從C++擴(kuò)展到CLIC++,多了一個(gè)選擇!

我的blog上也有一些相關(guān)的資料,如果有學(xué)習(xí)者,歡迎交流與我!~  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-13 18:35 giscn
確實(shí),C++/CLI使用極少,除非要將C++的遺留代碼連到.NET, C++/CLI語(yǔ)言成分非常多,可以看成兩種完全不同的模型的組合,建議要么學(xué)C#, 要么學(xué)標(biāo)準(zhǔn)C++.   回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-14 08:05 紫夜蒼狼
現(xiàn)在只學(xué)了C++,還不懂C#,不過(guò)覺(jué)得要學(xué)一下的,,  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-14 10:07 mAGICfLYER
CLI不是一種抽象層么,用來(lái)提供跨語(yǔ)言的支持,從而讓多種語(yǔ)言可以共用一些庫(kù)資源。  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法[未登錄](méi) 2008-07-14 13:16 Avlee
C++/CLI很多時(shí)候還是很有用的,特別是在你的.Net項(xiàng)目需要使用一些比較穩(wěn)定的C++庫(kù),而且這些庫(kù)沒(méi)有.Net版本的時(shí)候。這些情況在一些特殊領(lǐng)域很常見(jiàn)。  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-14 14:06 陳梓瀚(vczh)
@giscn
如果這樣就失去了把c++的庫(kù)接入c#的機(jī)會(huì)了。  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-14 15:51 giscn
@陳梓瀚(vczh)
C#與C++交互并不一定需要C++/CLI, 完全可以通過(guò)編譯成DLL來(lái)實(shí)現(xiàn),如果C++很熟,又要與C#交互,看看C++/CLI是可以的  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-15 18:23 陳梓瀚(vczh)
這倒是,只是我覺(jué)得c#的pinvoke比較鳥(niǎo)  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法 2008-07-16 15:10 葉付海的C++
繼續(xù)  回復(fù)  更多評(píng)論
  
# re: @轉(zhuǎn)C++/CLI學(xué)習(xí)方法[未登錄](méi) 2009-07-02 10:45 夢(mèng)
很有必要的.比如我做電機(jī)控制,客戶要求酷的界面,用C#肯定不行,C#沒(méi)有調(diào)用硬件端口的函數(shù).用MFC做界面又是不可選.而且一個(gè)好消息啊,C++/CLI可以調(diào)用WPF啊...享受混合編程吧...哈哈  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              91久久精品国产| 亚洲精品视频在线播放| 91久久精品一区二区三区| 久久精品国产精品亚洲| 亚洲欧美国产视频| 国产亚洲欧美日韩日本| 久久国产精品久久久久久| 欧美影院在线| 亚洲肉体裸体xxxx137| 亚洲精品日韩综合观看成人91| 欧美精品在线一区二区| 亚洲性视频h| 欧美在线视频导航| 亚洲人体一区| 亚洲欧美大片| 亚洲国产欧美在线| 制服丝袜激情欧洲亚洲| 国产一区在线视频| 91久久在线播放| 国产精品免费观看在线| 老司机精品导航| 欧美激情一区二区三区全黄| 亚洲欧美在线高清| 蜜桃av噜噜一区| 先锋影音国产精品| 欧美wwwwww| 久久国产手机看片| 欧美精品在线观看一区二区| 性欧美激情精品| 免费在线观看一区二区| 午夜国产精品视频| 欧美~级网站不卡| 午夜欧美电影在线观看| 欧美成年人网| 欧美主播一区二区三区| 欧美精品福利在线| 欧美一区二区三区四区在线观看| 蜜桃av综合| 久久久久久久91| 国产精品国产福利国产秒拍| 欧美电影资源| 国产一区二区电影在线观看| 亚洲裸体视频| 9国产精品视频| 久久久久久久尹人综合网亚洲 | 欧美激情视频给我| 久热精品视频在线观看一区| 国产精品www994| 亚洲人成7777| 亚洲精品在线视频观看| 久久精品三级| 久久亚洲视频| 国产综合精品| 欧美在线观看网站| 久久狠狠亚洲综合| 国产精品亚洲不卡a| 亚洲天堂av高清| 亚洲一区在线免费观看| 欧美日韩亚洲91| 日韩一区二区精品在线观看| 99精品99| 欧美日韩成人精品| 日韩一级网站| 午夜精品久久久久久久99水蜜桃 | 欧美伊人久久大香线蕉综合69| 亚洲欧美日韩综合aⅴ视频| 欧美日韩一区二区在线 | 老司机午夜精品视频| 国模精品一区二区三区| 久久精品国产一区二区三区免费看| 久久精品国产亚洲精品| 国产在线拍偷自揄拍精品| 欧美一区国产一区| 两个人的视频www国产精品| 在线成人激情视频| 男人的天堂亚洲在线| 91久久在线播放| 亚洲欧美一区二区精品久久久| 国产精品久久婷婷六月丁香| 午夜精品一区二区三区在线| 久久久一本精品99久久精品66| 国语自产精品视频在线看一大j8| 久久九九电影| 亚洲三级网站| 香蕉成人久久| 在线欧美影院| 欧美日韩综合视频| 久久aⅴ国产欧美74aaa| 亚洲电影免费观看高清完整版在线观看 | 欧美性一二三区| 亚洲午夜一二三区视频| 久久精品一区二区三区四区 | 曰韩精品一区二区| 欧美国产日韩在线| 亚洲一区二区少妇| 欧美gay视频激情| 中日韩在线视频| 国产在线高清精品| 欧美日韩一级片在线观看| 午夜伦欧美伦电影理论片| 欧美激情按摩在线| 销魂美女一区二区三区视频在线| 影音先锋欧美精品| 欧美日韩一区二区高清| 欧美在线综合视频| 99精品视频一区| 欧美freesex交免费视频| 性久久久久久久久| 日韩亚洲精品电影| 激情综合色丁香一区二区| 欧美日韩在线播放| 免费影视亚洲| 欧美在线观看视频| 亚洲午夜av| 亚洲日本va在线观看| 欧美成人嫩草网站| 欧美亚洲一区二区在线观看| 日韩亚洲视频在线| 亚洲第一精品在线| 国产亚洲一二三区| 国产精品电影网站| 欧美精品在线免费| 欧美电影打屁股sp| 久久人人爽人人| 久久国产精品久久精品国产 | 99精品视频一区| 亚洲欧洲综合| 亚洲国产成人一区| 欧美电影打屁股sp| 免费久久精品视频| 久久久蜜桃精品 | 亚洲精品欧洲| 亚洲国产欧美一区二区三区久久| 在线观看成人一级片| 激情av一区二区| 狠狠色狠狠色综合人人| 国产亚洲精品久久久久久| 国产酒店精品激情| 国产日本亚洲高清| 国产欧美精品一区二区三区介绍| 国产精品剧情在线亚洲| 国产精品久久久对白| 国产精品久久久久久久久免费桃花| 欧美日韩一级片在线观看| 欧美日韩精品伦理作品在线免费观看| 女生裸体视频一区二区三区| 免费日韩视频| 欧美精品乱码久久久久久按摩 | 亚洲欧美精品suv| 亚洲综合社区| 欧美亚洲三级| 久久野战av| 免费欧美日韩国产三级电影| 亚洲午夜一区二区三区| 国产精品户外野外| 国产精品午夜在线| 国产亚洲精品久久久| 亚洲国产精彩中文乱码av在线播放| 影视先锋久久| av成人免费在线| 亚洲欧美精品在线观看| 久久狠狠婷婷| 亚洲高清视频在线| 一二美女精品欧洲| 欧美在线视频免费观看| 另类av导航| 国产精品99一区| 一区二区三区在线看| 日韩一区二区精品葵司在线| 午夜精品福利在线| 蜜桃av噜噜一区二区三区| 亚洲精品一品区二品区三品区| 亚洲香蕉视频| 美女尤物久久精品| 国产精品久久久久久久久久ktv| 国产自产女人91一区在线观看| 最新国产の精品合集bt伙计| 亚洲欧美国产77777| 欧美国产精品劲爆| 午夜一区二区三区在线观看| 美日韩精品免费观看视频| 国产老肥熟一区二区三区| 99国产精品99久久久久久| 久久精品国产清自在天天线| 亚洲精选在线| 久久九九热re6这里有精品| 欧美日韩美女一区二区| 激情欧美日韩一区| 亚洲欧美久久| 亚洲黄页一区| 久久久久久久久蜜桃| 国产精品美女| 一本色道久久综合狠狠躁篇怎么玩| 久久婷婷色综合| 亚洲视频在线播放| 欧美日本国产精品| 亚洲二区在线视频| 久久久蜜桃精品| 先锋亚洲精品| 国产精品一卡二卡|