微軟Visual C++開發小組在廣泛聽取意見的基礎上,重新改進了c,在Visual Studio .NET 2002中那種“笨拙”的C++托管擴展語法已經一去不復返了,而修訂後的語言定義帶來的是一個完全充滿吸引力的新語法。
和一體化的語言支持特性,如部分模板專用化;同時也包括了增強的緩沖區安全檢查和改進的編譯器診斷功能。以往使用C#和Visual Basic® .NET的開發者,通過簡單的拖放操作,就能生成穩健的Windows窗體應用程序,如今,C++的開發者也加入了進來。
而且,這個編譯器還對Intel Pentium 4和AMD Athlon處理器作了優化處理。如果Visual C++ .NET 2003都令你興奮不已,那麼它的最新版本Visual C++ 2005,足夠令你高興得發狂了。對於 .NET開發,Visual C++ 2005如今有了一套新的語法,不但顯得更“優雅”,而且更強大;
它擁有新的優化技術,可使程序的速度最高提高30%;同時新的編譯模式,可保證在Microsoft® .NET Framework之上生成完全遵從CLICommon Language Infrastructure)的可驗證代碼;而且新的interop模式,可提供本地與托管代碼的無縫融合。
相對於前兩個版本,新編譯器還包括了一個增強版本的緩沖區安全檢查選項,而且對C++程序普遍使用的庫,也有新的注重安全的版本。Visual C++ 2005對基於Intel Itanium和AMD64的64位平台,提供了對OpenMP標准的支持,並且修正了一些混合DLL加載的問題,對Double P/Invoke雙轉換)的性能問題,提供了自動運行時消除。關於類似的增強和改進還有很多很多,正如一位C++架構師說的那樣,“如今,C++終於站在了它應該站的位置上”。
可能我們中有不少人都發現,要在前兩個版本的C++中使用托管擴展語法,會非常麻煩並且錯誤重重,也許還會覺得,Visual C++並非是 .NET開發的首選語言。
微軟Visual C++開發小組在廣泛聽取意見的基礎上,重新改進了c,在Visual Studio .NET 2002中那種“笨拙”的C++托管擴展語法已經一去不復返了,而修訂後的語言定義帶來的是一個完全充滿吸引力的新語法。在語言設計上,微軟Visual C++開發小組制定了一些主要的目標。
首先對那些認為編程是藝術的人來說,也許是最重要的),他們要保證在開發者在編寫C++代碼時感覺自然,為達到這個目的,他們對ISO C++標准作了一個在語法上優雅的純粹擴展,目的是為了在像單擊部署、窗體設計支持和SQL Server™ 2005的托管代碼支持這些地方。
可更簡單地用C++編寫可驗證的代碼。他們想要設計出一個超過C++的語言,要帶給C++全部的 .NET能力,同時也要帶給 .NET全部的C++能力。現在看來,他們非常的成功。
新的擴展規范被稱為“Visual C++ 2005”,並且正在被標准化。在閱讀代碼時,最引人注意之處就是,以往那種在托管擴展中定義垃圾回收類、屬性等等常用到的雙下劃線關鍵字,現在已成為了歷史。雖然也有一些類似的關鍵字被保留,但由於不會被經常用到,所以不會對代碼的可讀性造成影響。這些雙下劃線關鍵字如今被兩種新的“關鍵字”取代:“上下文敏感”和“空格”。“上下文敏感”關鍵字是只在特定的上下文中,才是關鍵字;
而“空格”關鍵字只在聯合其他關鍵字時,才會是關鍵字。例如:在托管擴展中的關鍵字__property已被關鍵字property取代不只是這樣,定義和訪問屬性的整個語法都被精煉了,它的聲明與C#看起來很相似,參見插1),而且在你的代碼中,還可以使用property作為變量名,只有在一個類型中聲明屬性時,“property”才會被當作一個關鍵字。
現在,Visual C++ 2005對任何類型的托管和本地對象,都提供了一個析構函數或結束器finalizer)。當類型是托管時,編譯器映射一個析構函數到IDisposable::Dispose方法中。
這意味著,你可用C++來編寫同樣的方法——如插3中的第四段代碼,而且reader的析構或清除方法會被自動調用,就好像在C#中使用“using”一樣。這樣,當創建在堆棧上的類型超出作用范圍之後,它的析構函數就會被調用。
托管擴展帶來的最大問題就是指針問題了。
雖然指針很難理解,但卻是應付多種任務和多種情況的“多面手”。在Visual C++ 2005中,指針仍舊是老式的C++指針,它指向一個對象,並能執行一些算法。引用一個對象的指針,它的生存期必須由開發者顯示地管理,當與指針打交道時,運行時庫可不負責清理它。
現在,來看一下Visual C++ 2005的設計者是怎樣實現的吧,Visual Studio .NET 2003和Visual Studio .NET 2005中的new操作符通常返回一個指針,而gcnew操作符返回一個“句柄”,一個用脫字符 ^ 語法表示的一個結構,此句柄指向托管堆的對象。
因此,它們不能指向interior類型,而且在用法上,編譯器也作了不少限制,以便開發者正確、安全地使用它們。句柄不能執行指針算法,也不能轉換成一個空指針或任何其他整數類型,話說回來,依然可使用星號*)和箭號->)操作符。
這不是說,你再不能取得一個指向垃圾回收堆中的指針了,在Visual C++ 2005中的pin_ptr,可用於取得托管堆中對象的一個固定指針,只要這個指針存在,對象就被固定在托管堆中,以防止垃圾回收器清除它;Visual C++ 2005同時也引入了“引用跟蹤”操作符,以百分號 % 表示。
當年在Visual C++ 2005中引入 & 引用操作符時,大多數開發者把它理解成一個指向對象的指針,而且由編譯器自動解引用。在很多方面來說,% 之於 ^,就像 & 之於 *。
在托管世界中,對托管對象的本地引用,與指向托管對象的本地指針一樣危險,指針和引用的基本原理在於,被引用的對象不能四處移動。引用跟蹤與本地引用非常類似。
除了它引用的對象是在托管堆中,而且被垃圾回收器移動之後,還能繼續跟蹤它們。百分號 % 操作符用來取托管對象的地址,就像 & 操作符對於本地對象的功能一樣,百分號 % 操作符可返回一個托管引用類型對象的句柄。