C#與C++的區別!
(2)記憶體管理:C#將開發人員從記賬式的記憶體管理任務中解放出來,不再需要顯式地刪除動態分配的給堆的記憶體,而C++則要這麼做,無用儲存單元收集器將週期性地清空不再使用的記憶體,為了使這一功能簡便的執行,C#限制了儲存在堆疊中變數的使用。對於資料型別的安全性,C#的要求比C++更嚴格。
(3)指標:C#中指標的運用可能與C++一樣,但它只用於已特別標記為應用指標的程式碼塊中。對於大部分的程式,C#依賴VB/Java風格的對類例項的引用,而不需和C++一樣頻繁地使用指標。
(4)運算子過載:C#中可用來顯式過載的運算子比C++要少,很大程度上是因為,C#編譯器是運用一些定製的基本操作符過載(如=)來自動計算出組合操作符的過載(如+=)。
(5)庫:C++和C#都依賴於擴充套件庫的出現,ANSI C++依賴於標準庫,C#依賴於.NET基類。而.NET基類是以單一的繼承為基礎,而標準庫是以繼承和模板為基礎。ANSI C++的庫和語言本身是分離的,C#中則是互相依靠的,關係更為緊密。並且很多C#關鍵字的執行都依賴於特定的基類,
(6)目標環境:C#是基於GUI的環境下(不僅僅是Windows環境,儘管現在只是在Windows中可用)專門為程式設計和背景服務(如Web服務)而設計的。這與語言本身無關,而是反映在基類庫的設計中。相比較,C++是在命令列使用者介面時期被開發的,C#和標準庫都不支援GUI元素。在Windows中,C++必須直接或間接地依靠Windows API來實現這一支援。
(7)預處理指令:C#包含一些預處理指令,它的語法和C++一樣。但C#的預處理指令少得多,因為C#的其它語言特性使得這些指令不再重要。
(8)列舉:C#的列舉比C++中列舉的功能更為廣泛。它們在許可權範圍內的語法結構很成熟,可支援不同的屬性與方法。要注意的是,只有當代碼編譯為本機可執行程式碼時,這一支援才存在於原始碼中。列舉仍是作為基本的數字型別來執行的,所以不會存在效能上的損失。
(9)解構函式—當解構函式被呼叫後,C#不能保證它的執行除非要除空的是具體的外部原始碼,如檔案與資料庫連線,C#不可以在解構函式中放置程式碼,而C++則可以。因為無用儲存單元收集器清空的是所有動態分配的記憶體,所以解構函式在C#中沒有像在C++中那麼重要。有些情況下,僅可能地清空外部原始碼是很重要的,C#將執行一個包括Idisposable介面的替換機制。
(10)類與結構:C#正式區分了類(一般用於包含許多方法的大型物件)和結構(一般用於只包含變數集合的小型物件)類和結構的儲存方式不同,結構不支援繼承。它們還存在一些其它的區別。
作為一種新的語言,C#也擁有一些自己的特性,而這些特性是別的語言所不具備的,讓我們來看一看:
委託:C#不支援函式指標。但委託可以實現對應的功能,它把引用以一種特殊的形式封裝到方法中。委託可以在方法之間傳遞,用於呼叫包含引用的方法。這與C++指標的工作方式相同。委託的意義在於,它可以合併一個物件引用和一個方法引用。與函式指標不同的是,委託包含了呼叫類中方法例項的資訊。
事件:事件與委託相似,但它支援回撥模式。就是當執行一些操作時,客戶通知機器,將這些操作通知給它。工作方式與VB相同。
特性:這一概念在VB和COM中應用的很廣,C#中也匯入了這一概念。一個特性就是類中的一個方法,或者是類中的獲取/設定方法。從類的外部來看,它更像是一個欄位。可以編寫程式碼:MyFormHeight=400,但不能寫為:MyForm.SetHeight(400)。
介面:可以將介面看為是一個抽象的類,其目的是用來定義類同意執行的方法和屬性。C#介面與COM介面不同—C#介面是簡單的方法列表,而COM介面有其它的相關的特性,如GUIDS,但他們的原理基本相同。C#運用了介面繼承的原理,因此,類繼承的是函式的定義,而不是執行方式的定義。
屬性:C#可以用特性元資訊(如屬性)來修飾類、方法和引數等。可以在執行時內訪問屬性,已決定程式碼的執行。
確定執行緒:C#的lock語句可支援執行緒同步(C++不支援執行緒,必須在程式碼中通過呼叫API或其它的類庫來實現)
反射:C#中,程式碼可自動獲得已編譯的裝配件(庫和可執行檔案)中的類定義的資訊。可以編寫顯示類和方法資訊的程式