第一章:C# 簡介 — 現代、簡單、型別安全的企業級語言
C# 由 Anders Hejlsberg 主導設計,結合 C/C++ 效能與 VB 生產力,專為 .NET 平台打造。本章解析其核心設計哲學與關鍵特性。
為什麼需要另一種語言?
「C# 將成為下一代 Windows 服務 (NGWS) 應用程式的主要開發語言。」
- C++ 複雜度高(指標、模板、多重繼承、手動記憶體管理)
- VB 缺乏型別安全、效能限制、非全物件導向
- Java 跨平台但非 Windows 原生、效能與平台整合有折衷
- C# 目標:現代化、簡單、完全物件導向、型別安全、版本可控、相容、彈性
七大核心特性深度解析
1. 簡單
| 移除複雜特性 | 簡化機制 |
| 指標 (預設不允許) | 受控程式碼、GC、參考型別語意 |
多重運算子 (:: . ->) | 統一使用 . 存取成員 |
| 巨集、模板、多重繼承 | 泛型、介面、組合取代繼承 |
| 隱含型別大小 (平台相依) | 統一型別系統:int 永遠 32-bit |
| 整數/布林混用 | 嚴格型別:if 僅接受 bool |
| 冗餘關鍵字、字元型別 | 關鍵字精簡、char 統一 UTF-16 |
2. 現代
- 十進位型別:
decimal 專為金融/貨幣計算,28 位精度避免浮點誤差
- 垃圾收集:自動記憶體管理,開發者專注業務邏輯
- 跨語言例外處理:取代 COM
HRESULT,統一 try/catch/finally
- 屬性/事件/委派:元件化程式設計內建支援
- 安全性整合:Metadata 聲明式安全、Code Access Security
3. 完全物件導向
| 特性 | C# 實作 |
| 封裝 | 所有成員必須在類別/結構內,無全域函數/變數 |
| 繼承 | 單一繼承 + 多介面實作,sealed 禁止繼承 |
| 多型 | virtual/override,預設非虛擬提升效能 |
| 存取層級 | public/protected/private/internal 四層級 |
| 建構/解構 | 決定性初始化、IDisposable 模式釋放非受控資源 |
4. 型別安全
- 禁止未初始化變數:區域變數必須指派才能使用,欄位自動歸零
- 禁止不安全轉型:
int 不能轉 object,向下轉型執行期驗證
- 陣列邊界檢查:存取越界拋出
IndexOutOfRangeException
- 算術溢位檢查:
checked 區塊/專案設定啟用,溢位拋 OverflowException
- 參考參數型別安全:
ref/out 型別必須完全相符
5. 版本可控
解決「DLL 地獄」核心機制:
- 強式名稱:組件名稱 + 版本 + 文化特性 + 公開金鑰 Token
- 並存執行:同一組件多版本同時載入於不同 Application Domain
- 版本原則:發行者原則、應用程式設定檔導向繫結重導向
- 二進位相容:新增虛擬方法不破壞現有衍生類,
new 修飾詞解決版本衝突
6. 相容互通
| 技術 | 用途 |
| CLS 合規 | 跨語言元件互操作標準 |
| COM Interop | 透明呼叫現有 COM 元件 (RCW/CCW) |
| OLE Automation | dynamic、IDispatch 支援晚期繫結 |
| P/Invoke | 呼叫 Unmanaged DLL 匯出函數 (DllImport) |
7. 彈性:Unsafe 程式碼
當必須使用指標、高效能緩衝區操作、呼叫需指標的 Win32 API 時:
// 專案屬性啟用 "Allow unsafe code"
unsafe void FastBitmapProcess(byte* pixels, int length)
{
for (int i = 0; i < length; i++)
pixels[i] = (byte)(255 - pixels[i]); // 直接指標操作
}
// fixed 陳述式釘住陣列防止 GC 移動
byte[] buffer = new byte[1024];
fixed (byte* p = buffer)
{
FastBitmapProcess(p, buffer.Length);
}
unsafe 區塊/方法/類型標記不安全內容
fixed 防止 GC 重新定位記憶體
stackalloc 堆疊配置記憶體 (高效能暫存緩衝區)
- 安全與不安全程式碼同一執行緒、同一 AppDomain,無封送成本
C# vs C++ 關鍵差異速查
| 特性 | C++ | C# |
| 記憶體管理 | 手動 new/delete | GC 自動管理 |
| 指標 | 核心特性 | 受限 unsafe 內容 |
| 繼承 | 多重繼承 | 單一繼承 + 介面 |
| 虛擬函數 | 預設非虛擬 | 預設非虛擬 (相同) |
| 模板 | 編譯期多型 | 泛型 (執行期多型) |
| 巨集 | 預處理器 | 無 (用常數、屬性、泛型) |
| 解構函數 | 決定性 | 非決定性 (GC) + IDisposable |
| 命名空間 | C++11 才標準化 | 內建 namespace |
本章小結
- C# 捨棄 C++ 底層控制,換取開發效率、安全性、維護性
- 七大特性相輔相成:簡單→現代→物件導向→型別安全→版本控制→相容→彈性
- 預設安全,需要時可用
unsafe 突破限制
- 下一章將探討 .NET 執行環境理論基礎