C++ 追求底層控制(堆/堆疊/特定位址建構物件),C# 接受受控環境:型別位置固定(值型別在堆疊、參考型別在堆)、生命週期由 GC 非決定性回收、無解構函式(僅 Finalize/IDisposable)。這是思維模式的根本轉變——專注業務邏輯,將記憶體管理交給執行平台。
| 特性 | C++ | C# |
|---|---|---|
| 記憶體管理 | 手動 new/delete、智慧指標 | GC 自動回收(非決定性) |
| 物件建構位置 | 堆疊/堆/任意位址可控 | 值型別→堆疊,參考型別→堆(不可控) |
| 解構函式 | ~Class() 確定性呼叫 | 無;用 Finalize/IDisposable 模式 |
| 多重繼承 | 支援 | 不支援(介面多實作替代) |
| 模板 | 編譯期樣板 | 泛型(執行期型別參數化) |
| 指標運算 | 核心功能 | 僅 unsafe 區塊允許(不鼓勵) |
| 型別系統 | 語言定義 | CLR 定義(int = System.Int32) |
| 所有型別基底 | 無統一基底 | System.Object(含值型別裝箱) |
// C++: 結構體預設傳值,類別可傳參考
// C#: 結構體 是值型別,傳遞會複製整個實例
struct Point { public int X, Y; }
void Modify(Point p) { p.X = 10; } // 修改副本
Point p = new Point(); Modify(p); // p.X 仍為 0
// 若需傳參考,必須加 ref
void ModifyRef(ref Point p) { p.X = 10; }
ModifyRef(ref p); // p.X 變為 10
System.ValueType)protected 成員// ref: 呼叫端必須先初始化,雙向傳遞
void GetStats(ref int age, ref int id) { age = 25; id = 100; }
// out: 呼叫端無需初始化,方法內必須指派,單向輸出
void GetStatsOut(out int age, out int id) { age = 25; id = 100; }
// C# 7.0+ 內嵌宣告
GetStatsOut(out int age, out int id); // 更簡潔
new 在堆配置,呼叫建構函式new 在堆疊配置並初始化(呼叫建構函式);不使用 new 也可宣告,但必須手動初始化所有欄位才能使用get/set 封裝欄位,語法如欄位、實作如方法this[int i] 讓物件支援陣列存取語法yield return 極簡實作BeginRead/EndRead → async/await 簡化多執行緒語法相似度高掩蓋了運行時模型的巨大差異。接受 GC、放棄指標、善用框架類別庫,才能發揮 C# 生產力優勢。核心心法:信任執行平台,專注領域邏輯。