共用方式為


C++ 開發人員專用的 C#

更新:2007 年 11 月

下表包含 C# 和原生 C++ 之間的重要比較,後者不使用 /clr。如果您是 C++ 程式設計人員,這個表格將概要地提供您兩種語言之間最大的差異。

注意事項:

C++ 和 C# 專案是從不同的專案模型衍生的。如需 C++ 與 C# 專案之間差異的詳細資訊,請參閱專案中的項目管理使用方案總管

功能

參考主題

繼承 (Inheritance):在 C++ 中,類別和結構 (Struct) 在實質上是相同的;在 C# 中,這兩者則是非常不同。C# 類別可實作任意數目的介面,不過只能繼承自一個基底類別。而且,C# 結構不支援繼承,並且不支援明確預設建構函式 (依預設值提供了一個)。

class

interface

struct (C# 參考)

陣例:在 C++ 中,陣列只是指標。在 C# 中,陣列則是包含方法和屬性的物件。例如:透過 Length 屬性即可查詢陣列的大小。C# 陣列也採取用來確認存取陣列之每個索引的索引子。宣告 C# 陣列的語法不同於 C++ 陣列的語法:C# 中的語彙基元 (Token) "[]",出現在陣列型別的後方,而非變數的後方。

陣列 (C# 程式設計手冊)

索引子 (C# 程式設計手冊)

布林值:在 C++ 中,bool 型別其實是整數。在 C# 中,bool 型別和其他型別之間不能轉換。

bool

long 型別:在 C# 中,long 型別為 64 位元;在 C++ 中,則為 32 位元。

long

傳遞參數:在 C++ 中,除非明確以指標或參考傳遞,所有變數都會以傳值 (By Value) 方式傳遞。在 C# 中,類別都會以傳址 (By Reference) 方式傳遞;至於結構,除非運用 ref 或 out 參數修飾詞 (Modifier) 明確地以傳址方式傳遞,否則都會以傳值方式傳遞。

struct

class

ref (C# 參考)

out (C# 參考)

switch 陳述式:不同於 C++ switch 陳述式,C# 不支援從一個 case 標籤往下繼續執行另一個標籤。

switch

委派:C# 委派大致類似於 C++ 中的函式指標,是型別安全 (Type-Safe) 和安全的。

委派

基底類別方法:C# 支援使用 base 關鍵字呼叫衍生類別中的覆寫基底類別。而且,覆寫虛擬或抽象方法在 C# 中都是使用 override 關鍵字明確進行的。

base

請參閱override的範例

方法隱藏:C++ 透過繼承支援方法的隱含「隱藏」。在 C# 中,您必須使用 new 修飾詞來明確隱藏繼承的成員。

new

前置處理器指示詞是用於條件式編譯。C# 裡不使用標頭檔 (Header File)。

C# 前置處理器指示詞

例外處理:C# 提供 finally 關鍵字來準備不論是否擲回例外狀況,都應該要執行的程式碼。

try-finally

try-catch-finally

C# 運算子:C# 支援額外的運算子,例如 is 和 typeof。而且還對一些邏輯運算子引進不同的功能。

& 運算子

| 運算子

^ 運算子

is

typeof

typedef 關鍵字。在 C++ 中,typedef 的用途是為已宣告的型別建立較短或較方便的名稱。在 C# 中,則是以 using 指示詞來提供這項功能。

using 指示詞 (C# 參考)

extern 關鍵字:在 C++ 中,extern 用來匯入型別。在 C# 中,extern 則是用來建立使用相同組件 (Assembly) 之不同版本的別名 (Alias)。

extern

static 關鍵字:在 C++ 中,static 可以用來宣告類別層級實體 (Entity),也可以用來宣告模組的專屬型別。在 C# 中,static 只能用來宣告類別層級實體。

static

C# 中 Main 方法的宣告與 C++ 中 main 函式的宣告不同。在 C# 中此方法是大寫的,並且永遠會是 static。而且,在 C# 中對於命令列引數處理的支援也更為健全。

Main() 和命令列引數 (C# 程式設計手冊)

C# 允許使用指標,不過只能在 unsafe 模式中使用。

unsafe

多載化 (Overloading) 運算子的執行在 C# 中不一樣。

C# 運算子

字串:在 C++ 中,字串只是字元的陣列。在 C# 中,字串則是支援健全搜尋方法的物件。

string

String

foreach 關鍵字讓您夠逐一查看陣列和集合。

foreach、in

全域:在 C# 中,並不支援全域方法和變數。方法和變數都必須包含在 class 或 struct 的內部。

C# 程式的一般結構

#define 前置處理器指示詞:在 C++ 中,#define 指示詞一般用來宣告常數值。在 C# 中,#define 指示詞則無法用於這項目的。C# 中的常數最好定義為列舉型別 (僅限整數值) 或 class 或 struct 的靜態成員。如果擁有多個此類常數,請考慮建立個別的 "Constants" 類別來保存這些常數。

static (C# 參考)

const (C# 參考)

enum (C# 參考)

匯入型別:在 C++ 中,共通於多個模組的型別都會放置在標頭檔中。在 C# 中,則是透過中繼資料提供這項資訊。

using

中繼資料概觀

在 C# 中,必須初始化之後才能使用區域變數。

方法 (C# 程式設計手冊)

記憶體管理:C++ 是不會自動回收記憶體的語言;直到處理序結束之前,沒有明確釋放的記憶體都會維持配置。C# 是會自動回收記憶體的語言。

記憶體回收

解構函式:C# 具有決定性釋放 Unmanaged 資源的不同語法。

解構函式

using 陳述式 (C# 參考)

建構函式:與 C++ 類似,如果您沒有在 C# 提供類別建構函式,便會為您自動產生一個預設的建構函式。這個預設建構函式會將所有欄位初始化成其預設值。

執行個體建構函式

預設值表

C# 不支援位元欄位 (Bit Field)。

C++ 位元欄位

C# 輸出/輸入服務和格式化是依賴 .NET Framework 的執行階段程式庫。

C# 語言教學課程

格式化數值結果表

在 C# 中,方法參數無法具有預設值。如果您要獲得同樣的效果,請使用方法多載。

編譯器錯誤 CS0241

在 C# 中,泛型型別和方法提供與 C++ 範本相似的型別參數化,但也有顯著的差異。例如,在 C# 中,泛型型別資訊在執行階段會保留。

C# 中的泛型

as 關鍵字相似於標準的轉型 (Cast),只是不會在轉換失敗時擲回例外狀況,而是會傳回 null 值。這點相似於使用 C++ 中的 static_cast,而不同於 dynamic_cast,不會進行執行階段檢查,因此不會在失敗時擲回例外狀況。

as (C# 參考)

如需比較 C# 與其他程式設計語言中關鍵字的詳細資訊,請參閱語言對等用法。如需 C# 應用程式一般結構的資訊,請參閱 C# 程式的一般結構 (C# 程式設計手冊)

請參閱

概念

C# 程式設計手冊

專案中的項目管理

使用方案總管