C++ 開發人員專用的 C#
更新:2007 年 11 月
下表包含 C# 和原生 C++ 之間的重要比較,後者不使用 /clr。如果您是 C++ 程式設計人員,這個表格將概要地提供您兩種語言之間最大的差異。
注意事項: |
---|
C++ 和 C# 專案是從不同的專案模型衍生的。如需 C++ 與 C# 專案之間差異的詳細資訊,請參閱專案中的項目管理和使用方案總管。 |
功能 |
參考主題 |
---|---|
繼承 (Inheritance):在 C++ 中,類別和結構 (Struct) 在實質上是相同的;在 C# 中,這兩者則是非常不同。C# 類別可實作任意數目的介面,不過只能繼承自一個基底類別。而且,C# 結構不支援繼承,並且不支援明確預設建構函式 (依預設值提供了一個)。 |
|
陣例:在 C++ 中,陣列只是指標。在 C# 中,陣列則是包含方法和屬性的物件。例如:透過 Length 屬性即可查詢陣列的大小。C# 陣列也採取用來確認存取陣列之每個索引的索引子。宣告 C# 陣列的語法不同於 C++ 陣列的語法:C# 中的語彙基元 (Token) "[]",出現在陣列型別的後方,而非變數的後方。 |
|
布林值:在 C++ 中,bool 型別其實是整數。在 C# 中,bool 型別和其他型別之間不能轉換。 |
|
long 型別:在 C# 中,long 型別為 64 位元;在 C++ 中,則為 32 位元。 |
|
傳遞參數:在 C++ 中,除非明確以指標或參考傳遞,所有變數都會以傳值 (By Value) 方式傳遞。在 C# 中,類別都會以傳址 (By Reference) 方式傳遞;至於結構,除非運用 ref 或 out 參數修飾詞 (Modifier) 明確地以傳址方式傳遞,否則都會以傳值方式傳遞。 |
|
switch 陳述式:不同於 C++ switch 陳述式,C# 不支援從一個 case 標籤往下繼續執行另一個標籤。 |
|
委派:C# 委派大致類似於 C++ 中的函式指標,是型別安全 (Type-Safe) 和安全的。 |
|
基底類別方法:C# 支援使用 base 關鍵字呼叫衍生類別中的覆寫基底類別。而且,覆寫虛擬或抽象方法在 C# 中都是使用 override 關鍵字明確進行的。 |
請參閱override的範例 |
方法隱藏:C++ 透過繼承支援方法的隱含「隱藏」。在 C# 中,您必須使用 new 修飾詞來明確隱藏繼承的成員。 |
|
前置處理器指示詞是用於條件式編譯。C# 裡不使用標頭檔 (Header File)。 |
|
例外處理:C# 提供 finally 關鍵字來準備不論是否擲回例外狀況,都應該要執行的程式碼。 |
|
C# 運算子:C# 支援額外的運算子,例如 is 和 typeof。而且還對一些邏輯運算子引進不同的功能。 |
|
typedef 關鍵字。在 C++ 中,typedef 的用途是為已宣告的型別建立較短或較方便的名稱。在 C# 中,則是以 using 指示詞來提供這項功能。 |
|
extern 關鍵字:在 C++ 中,extern 用來匯入型別。在 C# 中,extern 則是用來建立使用相同組件 (Assembly) 之不同版本的別名 (Alias)。 |
|
static 關鍵字:在 C++ 中,static 可以用來宣告類別層級實體 (Entity),也可以用來宣告模組的專屬型別。在 C# 中,static 只能用來宣告類別層級實體。 |
|
C# 中 Main 方法的宣告與 C++ 中 main 函式的宣告不同。在 C# 中此方法是大寫的,並且永遠會是 static。而且,在 C# 中對於命令列引數處理的支援也更為健全。 |
|
C# 允許使用指標,不過只能在 unsafe 模式中使用。 |
|
多載化 (Overloading) 運算子的執行在 C# 中不一樣。 |
|
字串:在 C++ 中,字串只是字元的陣列。在 C# 中,字串則是支援健全搜尋方法的物件。 |
|
foreach 關鍵字讓您夠逐一查看陣列和集合。 |
|
全域:在 C# 中,並不支援全域方法和變數。方法和變數都必須包含在 class 或 struct 的內部。 |
|
#define 前置處理器指示詞:在 C++ 中,#define 指示詞一般用來宣告常數值。在 C# 中,#define 指示詞則無法用於這項目的。C# 中的常數最好定義為列舉型別 (僅限整數值) 或 class 或 struct 的靜態成員。如果擁有多個此類常數,請考慮建立個別的 "Constants" 類別來保存這些常數。 |
|
匯入型別:在 C++ 中,共通於多個模組的型別都會放置在標頭檔中。在 C# 中,則是透過中繼資料提供這項資訊。 |
|
在 C# 中,必須初始化之後才能使用區域變數。 |
|
記憶體管理:C++ 是不會自動回收記憶體的語言;直到處理序結束之前,沒有明確釋放的記憶體都會維持配置。C# 是會自動回收記憶體的語言。 |
|
解構函式:C# 具有決定性釋放 Unmanaged 資源的不同語法。 |
|
建構函式:與 C++ 類似,如果您沒有在 C# 提供類別建構函式,便會為您自動產生一個預設的建構函式。這個預設建構函式會將所有欄位初始化成其預設值。 |
|
C# 不支援位元欄位 (Bit Field)。 |
|
C# 輸出/輸入服務和格式化是依賴 .NET Framework 的執行階段程式庫。 |
|
在 C# 中,方法參數無法具有預設值。如果您要獲得同樣的效果,請使用方法多載。 |
|
在 C# 中,泛型型別和方法提供與 C++ 範本相似的型別參數化,但也有顯著的差異。例如,在 C# 中,泛型型別資訊在執行階段會保留。 |
|
as 關鍵字相似於標準的轉型 (Cast),只是不會在轉換失敗時擲回例外狀況,而是會傳回 null 值。這點相似於使用 C++ 中的 static_cast,而不同於 dynamic_cast,不會進行執行階段檢查,因此不會在失敗時擲回例外狀況。 |
如需比較 C# 與其他程式設計語言中關鍵字的詳細資訊,請參閱語言對等用法。如需 C# 應用程式一般結構的資訊,請參閱 C# 程式的一般結構 (C# 程式設計手冊)。