C++ 程式設計:C# 與 C++ 的比較
外觀
C#(發音為“See Sharp”)是一種多用途的計算機程式語言,它使用Microsoft .NET Framework滿足所有開發需求。
我們已經涵蓋了Java。C# 非常類似,它採用了 C++ 的基本運算子和風格,但強制程式型別安全,即在稱為虛擬機器的受控沙箱中執行程式碼。因此,所有程式碼都必須封裝在物件中,以及其他事項。C# 提供了許多補充功能,方便與Microsoft 的 Windows、COM 和 Visual Basic 進行互動。C# 是一種 ECMA 和 ISO 標準。
C# 是微軟對(當時由 Sun 開發的)Java 語言的回應,Java 語言開始對企業產生重大影響。在他們試圖將 J++ 推向市場失敗以及與 Sun 的法律糾紛後,微軟將重點轉向了託管語言,即使是以維護擁有大量開發人員基礎的 Visual Basic 的相關性為目的,因此隨著 Windows “Longhorn” 專案(後來成為 Windows Vista)的宣佈,推向託管語言及其與 Windows 作業系統的整合開始了,他們相信從那時起,“所有新的 Windows API 將是託管的”。
然而,今天,微軟似乎終於意識到,即使考慮到 Java 的採用,託管語言也缺乏開發作業系統的要求。微軟甚至開始了一個基於 C# 的作業系統來測試這個前提,但最終意識到所有主要軟體專案,甚至附帶 Windows 作業系統的實用程式,大多是基於 C 或 C++ 的。即使託管程式碼仍然有一席之地,C 和 C++ 最終被公認為未來可預見的軟體行業的核心語言。在 Windows 中,這被看作是營銷機器長期籠罩開發人員的黑暗時代之後,迎來的“C++ 復興”。
- C# 和 C++ 之間的一些相似之處
- 它們都是面向物件的語言,這意味著它們使用類、繼承和多型性(儘管語法不同)。這可以被認為是一個區別,因為 C# 被認為是一種純粹的面向物件的語言,而 C++ 支援各種其他正規化。
- C# 和 C++ 都是編譯語言,這意味著原始碼必須轉換為二進位制格式才能執行。
- C# 和 C++ 之間的一些區別
- C++ 編譯為機器程式碼,而 C# 編譯為中間表示,它在公共語言執行時 (CLR) 虛擬機器上執行。
- C# 通常不使用指標,而在 C++ 中,指標經常被使用。C# 只允許在不安全模式下使用指標。
- C# 主要由 Windows 使用,這並不方便,但 C++ 可以毫無問題地在任何平臺上使用。
- C++ 可以製作獨立應用程式,而 C# 則不能。
- C# 支援 foreach 迴圈,但 C++ 不支援。
- C++ 支援多重繼承,但 C# 不支援多重繼承
- C# 除了 private、public 和 protected 之外,還有兩個額外的修飾符,分別是 internal 和 protected internal。
- C++ 更常用於應用程式開發,因為它與硬體有直接的互動,並且對效能的要求更高,但 C# 程式設計主要用於 Web 和桌面應用程式,這些應用程式的效能並不那麼重要。
- C# 相比 C++ 的缺點
- 限制:在 C# 中,諸如從類繼承多重繼承(C# 實現了一種不同的方法,稱為多重實現,其中一個類可以實現多個介面)、在堆疊上宣告物件、確定性銷燬(允許RAII)以及允許將預設引數作為函式引數(在 C# 版本 < 4.0 中)等功能將不可用。
- 效能(速度和大小):使用 C# 構建的應用程式與本地 C++ 相比,效能可能並不那麼好。C# 有一個侵入式垃圾收集器、引用跟蹤和其他框架服務的一些開銷。僅 .NET 框架本身就具有很大的執行時佔用空間(約 30 MB 記憶體),並且需要安裝多個版本的框架。
- 靈活性:由於依賴於 .NET 框架,作業系統級功能(系統級 API)被一組通用的函式緩衝,這將減少一些自由度。
- 執行時重新分發:程式需要與 .NET 框架一起分發(Windows XP 之前或非 Windows 機器),類似於 Java 語言的問題,並附帶所有正常升級要求。
- 可移植性:完整的 .NET 框架只在 Windows 作業系統上可用,但有一些開源版本提供了大部分核心功能,也支援 GNU-Linux 作業系統,例如 MONO 和 Portable.NET http://www.gnu.org/software/dotgnu/pnet.html。例如,對於 C# 和 CLI 擴充套件到 C++,有 ECMA 和 ISO .NET 標準。
- C# 相比 C++ 的優點
C++ 中有幾個缺點在 C# 中得到了解決
- 一個比較微妙的缺點是使用引用變數作為函式引數。當代碼維護者檢視 C++ 原始碼時,如果呼叫的函式在某個標頭檔案中宣告,則立即程式碼不會提供任何指示,表明函式的引數是以非 const 引用傳遞的。按引用傳遞的引數可以在呼叫函式後更改,而按值傳遞或按 const 傳遞的引數則不能更改。一個不熟悉該函式且正在尋找變數意外值變化位置的維護者,還需要檢查該函式的標頭檔案,以確定該函式是否可能更改了該變數的值。C# 堅持在函式呼叫中(除了函式宣告)放置ref關鍵字,從而提醒維護者該值可能會被函式更改。
- 另一個是記憶體管理,C# 在虛擬機器中執行,虛擬機器具有處理記憶體管理的能力,但在 C++ 中,開發人員需要自己處理記憶體。C# 有一個垃圾收集器,它釋放那些不再使用的物件所指向的記憶體。