前言:型別安全是 C# 的基石
C# 是強型別、靜型別、物件導向語言。所有值皆為物件(透過裝箱/解箱),型別系統嚴格區分實值型別與參考型別。本文系統整理 C# 核心型別分類、變數/常數語意、運算子與特殊運算子、命名空間組織、陳述式分類與控制流程。
一、型別系統:實值型別 vs 參考型別
1.1 記憶體語意差異
| 特性 | 實值型別 | 參考型別 |
| 儲存內容 | 直接包含資料位元 | 參考(指標)指向堆上物件 |
| 配置位置 | 執行緒堆疊 / 內嵌於物件 | 托管堆 |
| 指派語意 | 複製值(獨立副本) | 複製參考(共享同一物件) |
| 預設值 | 全 0 位元模式(0/false/\0) | null |
| 繼承 | 隱含繼承 System.ValueType → Object,密封 | 單根繼承 Object |
| 範例 | int、struct、enum、tuple | class、interface、delegate、array、string |
1.2 內建簡單型別對照表
| C# 關鍵字 | CLR 型別 | 大小/範圍 | 常值尾碼 |
sbyte | System.SByte | 8-bit 有號 | - |
byte | System.Byte | 8-bit 無號 | - |
short | System.Int16 | 16-bit 有號 | - |
ushort | System.UInt16 | 16-bit 無號 | - |
int | System.Int32 | 32-bit 有號 | - |
uint | System.UInt32 | 32-bit 無號 | U/u |
long | System.Int64 | 64-bit 有號 | L/l |
ulong | System.UInt64 | 64-bit 無號 | UL/ul |
float | System.Single | 32-bit IEEE 754 | F/f |
double | System.Double | 64-bit IEEE 754 | D/d(預設) |
decimal | System.Decimal | 128-bit 10 進制 28-29 位有效數字 | M/m |
bool | System.Boolean | true/false | - |
char | System.Char | 16-bit Unicode | 'c' |
string | System.String | 不可變字串 | "text"/@\"verbatim\" |
1.3 裝箱與解箱
int i = 42;
object o = i; // 裝箱:配置堆上物件,複製值
int j = (int)o; // 解箱:驗證型別,複製值回堆疊
// 頻繁裝箱造成 GC 壓力 → 使用泛型/介面避免
二、變數與常數
2.1 七種變數分類
- 靜態變數:
static 欄位,型別載入時配置,應用程式域存活期間存在。
- 實例變數:非
static 欄位,實例建立時配置,實例回收時釋放。
- 實值參數:無修飾符參數,呼叫時複製值/參考。
- 參考參數:
ref 參數,別名傳遞,雙向同步。
- 輸出參數:
out 參數,呼叫端無需初始化,方法內必須指派。
- 參數陣列:
params 參數,封裝可變引數為陣列。
- 區域變數:方法/區塊內宣告,作用域限於區塊,生命週期隨方法執行。
2.2 常數 const vs 唯讀 readonly
const:編譯期常數,IL 內嵌常值,型別限制嚴格(簡單型別、string、enum、null),隱含 static。
readonly:執行期常數,宣告或建構函式指派,型別無限制,可為實例/靜態。
- 版本控制:修改
const 需重編譯所有呼叫端;readonly 僅需重編譯定義組件。
三、運算子與特殊運算子
3.1 運算子分類與優先序(高→低)
- 主要:
x.y f(x) a[x] x++ x-- new typeof checked unchecked default nameof delegate sizeof stackalloc x->y
- 一元:
+ - ! ~ ++x --x (T)x await
- 乘法:
* / %
- 加法:
+ -
- 位移:
<< >>
- 關係/型別測試:
< > <= >= is as
- 等值:
== !=
- 邏輯 AND:
&
- 邏輯 XOR:
^
- 邏輯 OR:
|
- 條件 AND:
&&
- 條件 OR:
||
- Null 聯合:
??
- 條件:
?:
- 指派:
= += -= *= /= %= &= |= ^= <<= >>= ??=
- Lambda:
=>
3.2 C# 特有關鍵運算子
| 運算子 | 功能 | 範例 |
is | 型別模式比對(C# 7+ 支援模式) | obj is int i、obj is Person { Age: > 18 } |
as | 安全轉型,失敗回傳 null(僅參考/可為 null 型別) | var s = obj as string; |
typeof | 取得 System.Type 物件(編譯期) | typeof(int)、typeof(List<string>) |
nameof | 取得符號名稱字串(重構安全) | nameof(Console.WriteLine) |
default | 型別預設值字面值 | default(int)、default(T) |
sizeof | 非受控記憶體大小(需 unsafe) | sizeof(Point) |
stackalloc | 堆疊配置記憶體區塊(需 unsafe,C# 7.2+ 可用 Span<T> 安全包裝) | Span<byte> buf = stackalloc byte[256]; |
?? / ??= | Null 聯合運算子 / 指派 | var s = obj ?? "預設";、obj ??= new Obj(); |
?. / ?[] | Null 條件運算子 | obj?.Method()、arr?[0] |
3.3 運算子多載
- 可多載:
+ - * / % & | ^ << >> == != < > <= >= ! ~ true false
- 不可多載:
= . ?: ?? ??= && || new typeof is as checked unchecked default nameof sizeof stackalloc
- 規則:
public static、至少一個參數為定義型別、成對多載(==/!=、</> 等)。
四、命名空間與 using 指示詞
4.1 命名空間組織
namespace MyCompany.MyProduct.Feature {
public class MyClass { }
}
// 巢狀等同於
namespace MyCompany.MyProduct {
namespace Feature {
public class MyClass { }
}
}
4.2 using 三種用法
- 指示詞:
using System; → 簡化型別名稱(Console 代替 System.Console)。
- 別名指示詞:
using Json = System.Text.Json; → 解決名稱衝突、縮短長命名空間。
- 靜態導入(C# 6+):
using static System.Console; → 直接呼叫 WriteLine()、存取 Math.PI。
五、陳述式分類與控制流程
| 類別 | 關鍵字 | 說明 |
| 標籤 | label: goto label; | 方法內跳轉(慎用) |
| 宣告 | int x = 1; var y = Foo(); | 可含初始化,var 隱含型別 |
| 區塊 | { ... } | 界定區域變數作用域 |
| 空白 | ; | 無語意 |
| 運算式 | x = y + z; Method(); | 以分號結尾 |
| 選擇 | if/else switch switch 表達式 (C# 8+) | switch 支援模式比對、when 守衛 |
| 迭代 | while do-while for foreach | foreach 需 IEnumerable/GetEnumerator |
| 跳躍 | break continue goto return throw | throw 拋出例外 |
| 例外處理 | try/catch/finally | 結構化例外,finally 保證執行 |
| 檢查溢位 | checked/unchecked 區塊/運算式 | 整數溢位行為控制 |
| 鎖定 | lock(obj) { } | Monitor.Enter/Exit 語法糖 |
| 資源處置 | using (var d = new Disposable()) { } | IDisposable.Dispose() 語法糖 (C# 8+ 可省略區塊) |
| 非同步 | await yield return yield break | 非同步/迭代器語法糖 |
六、現代 C# 精華:模式比對、記錄、全域 using、檔案區域型別
- 模式比對:
is、switch、property pattern、tuple pattern、list pattern (C# 11)。
- record:不可變參考型別,值相等、
with 表達式、解構。
- global using (C# 10+):專案層級匯入,減少重複。
- file-local types (C# 11+):
file class Helper { } 僅單一檔案可見。
- required members (C# 11+):強制物件初始化器指派。
結語
C# 型別系統嚴格區分實值/參考語意,變數分類精確對應生命週期,運算子豐富且可多載,命名空間與 using 提供模組化組織,陳述式涵蓋命令式與現代函數式風格。掌握核心語法語意、善用模式比對簡化條件邏輯、採用 record/readonly struct 表達不可變資料、遵循 IDisposable/using 管理資源,即能寫出型別安全、表達力豐富、效能可預期的專業 C# 程式碼。