系列簡介
本系列共十二講,系統性闡述 C# 語言特性與 .NET 平台機制,從基礎語法進階至組件導向程式設計、反射、互操作、非受控程式設計等核心主題。適合有程式基礎、想深度掌握 C# 的開發者。
課程大綱
- 第一講:Hello World — IL、中繼資料、PE 檔案、CLR 執行流程
- 第二講:語言基礎 — 型別系統、變數/常數、運算子、命名空間、陳述式
- 第三講:.NET 平台架構 — CLR、框架類別庫、記憶體管理、垃圾收集
- 第四講:類別與物件 — 封裝、修飾詞、抽象/密封、this、System.Object
- 第五講:建構子與解構子 — 實例/靜態建構子、初始化順序、Finalize、Dispose、GC 抑制
- 第六講:方法 — 參數傳遞、多載、virtual/override/sealed/abstract、extern
- 第七講:欄位與屬性 — readonly/const、屬性存取子、虛擬屬性、抽象屬性
- 第八講:索引子與運算子多載 — this 索引子、一元/二元/轉換運算子、複數類別範例
- 第九講:陣列、字串、結構、列舉 — 多維/交錯陣列、字串不可變性、值型別語意
- 第十講:特性與反射 — Attribute、Type、Assembly、動態載入、晚期繫結
- 第十一講:COM 互操作與異常處理 — RCW/CCW、Platform Invoke、unsafe、try/catch/finally
- 第十二講:C# 程式設計模型總覽 — 組件導向、版本控制、部署、未來展望
核心亮點摘錄
第一講:Hello World 背後的機制
// 原始碼
using System;
class HelloWorld { public static void Main() { Console.WriteLine("Hello World!"); } }
// 編譯輸出:PE 檔案 = IL + 中繼資料 + Win32 Header
// IL 範例:
.method public static void Main()
{
.entrypoint
ldstr "Hello World!"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
執行流程:OS 載入 PE → 跳轉 mscoree.dll!_CorExeMain → CLR 啟動 → JIT 編譯 IL → 執行 → GC 管理記憶體。
第三講:CLR 與記憶體管理
- CLR 服務:記憶體、執行緒、安全性、遠端、JIT、型別安全
- Managed Heap:新物件配置於 Generation 0,GC 依存活時間分代收集
- 大型物件堆 (LOH):>85KB 物件直接進 Gen 2,不壓縮,易碎片化
- Finalization:~Finalize() 會延遲回收兩輪 GC,慎用;優先實作
IDisposable
第四講:System.Object 核心方法
| 方法 | 用途 | 建議 |
Equals | 值相等比較 | 值型別必覆寫;參考型別視語意覆寫 |
GetHashCode | 雜湊碼 | 覆寫 Equals 時必覆寫此法 |
ToString | 字串表示 | 建議覆寫供除錯/日誌使用 |
Finalize | 終結 | 僅清理非受控資源 |
MemberwiseClone | 淺層複製 | 不可覆寫;深層複製實作 ICloneable |
第五講:建構子初始化順序
class Base { public Base() { Print(); } public virtual void Print() {} }
class Derived : Base
{
int x = 1; // 1. 欄位初始化(最早)
int y; // y = 0 (預設值)
public Derived() // 3. 本體建構子
{
y = -1;
Print(); // 此時 x=1, y=-1
}
public override void Print() => Console.WriteLine($"x={x}, y={y}");
}
// 執行結果:
// x=1, y=0 (Base 建構子呼叫 Print,Derived.y 尚未指派 -1)
// x=1, y=-1 (Derived 建構子呼叫 Print)
第八講:運算子多載規則
- 必須
public static
- 一元運算子:1 參數,
++/-- 回傳型別必同類別
- 二元運算子:2 參數,至少 1 參數為定義類別
- 轉換運算子:
implicit/explicit,參數與回傳型別必有一為定義類別
==/!=、>/<、>=/<= 必成對定義
第十一講:非受控程式設計
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int MessageBox(IntPtr hWnd, string text, string caption, int type);
// unsafe 區塊:指標運算
unsafe void Copy(byte* src, byte* dst, int count)
{
for (int i = 0; i < count; i++) dst[i] = src[i];
}
// 固定陣列位址
byte[] arr = new byte[100];
fixed (byte* p = arr) { Copy(p, p + 50, 10); }
學習建議
- 動手編譯每講範例,使用
ildasm.exe 觀察 IL
- 理解「語言特性 → IL → CLR 執行」的完整鏈路
- 重點掌握:型別系統、GC、委派/事件、泛型、LINQ、async/await、Span/Memory
- 實作小專案:JSON 序列化器、簡易 DI 容器、HTTP 中介軟體管線
資源連結
- 上一篇文章: C# 操作 Excel 完整指南:COM 互操作、資料匯出、部署與避坑指南
- 下一篇文章: C# TextBox 限制僅能輸入數字:TextChanged 事件過濾非數值字元完整解析
Copyright ©
程式碼之家 All Rights Reserved