C# 學習筆記整理
一、程式執行基礎
1.1 程式入口點 (Entry Point)
- 主程式會尋找包含
Main()
方法的類別,而非特定名稱的類別
Program
只是慣例名稱,不是規定
- 編譯器會搜尋整個專案中哪個類別包含
static void Main()
1.2 Main() 方法特性
- static:屬於類別本身,CLR 可以直接呼叫,不需建立物件
- void / int:可選擇是否回傳結束狀態碼
- Main:.NET 語言規範定義的保留名稱
1.3 多個 Main() 的處理
- 一個應用程式只能有一個 entry point
- 若有多個 Main(),編譯器會報錯
- 解決方式:
- Visual Studio:專案屬性 → 應用程式 → 啟動物件
- 命令列:
csc /main:ClassName
- 多專案方案:各專案有各自的 Main()
1.4 Top-level Statements (C# 9+)
- 可省略 class 和 Main(),直接在檔案最上方寫程式碼
- 編譯器會自動生成隱藏的 class 與 Main()
二、CLR 與執行機制
2.1 CLR (Common Language Runtime)
- .NET 的核心執行引擎,類似虛擬機器
- 功能:記憶體管理、型別安全、例外處理、垃圾回收、多執行緒、安全性檢查
2.2 執行流程
- 執行
dotnet run
- CLR 啟動並載入程式組件 (.exe)
- CLR 檢查組件中的 entry point
- CLR 呼叫 Main() 方法
2.3 編譯過程
C# 原始碼 → 編譯成 IL → 打包進 .exe/.dll → 執行時 CLR 載入 IL → JIT 轉成機器碼 → CPU 執行
三、記憶體管理
3.1 Stack (堆疊)
- 儲存:區域變數、函式參數、返回位址
- 特性:速度快、自動管理、LIFO (後進先出)
- 釋放時機:函式執行結束時自動釋放
3.2 Heap (堆積)
- 儲存:物件實體、動態分配的資料
- 特性:空間大、彈性高、需要 GC 管理
- 釋放時機:GC 偵測到無參考時回收
3.3 參考型別 vs 值型別
特性 |
class (參考型別) |
struct (值型別) |
記憶體位置 |
Heap |
Stack (或內嵌) |
變數存放 |
參考 (reference) |
實際值 |
複製行為 |
複製參考 |
複製整份資料 |
繼承 |
支援 |
不支援 (可實作介面) |
預設值 |
null |
各欄位預設值 |
四、資料型別
4.1 基本型別
- int:4 byte (32 bit)
- float:4 byte,精度 7 位
- double:8 byte (預設小數型別)
- decimal:16 byte,高精度
- char:2 byte (UTF-16 編碼)
- bool:1 byte
- short:2 byte
- byte:1 byte (8 bit)
4.2 字串 (string)
- 參考型別,但具有不可變性 (Immutable)
- 變數存在 Stack,字串物件存在 Heap
- 修改字串會建立新物件,而非修改原物件
4.3 陣列 (Array)
- 參考型別
- 陣列本體在 Heap,變數 (reference) 在 Stack
- 傳遞陣列時傳的是參考,修改會影響原陣列
4.4 型別轉換
- 隱式轉換:小型別 → 大型別 (如 int → float)
- 顯式轉換:大型別 → 小型別 (需強制轉型)
- 轉換順序:int → float → double → decimal
- 枚舉轉換:
- enum → int:允許
(int)myEnum
- int → enum:必須
(MyEnum)myInt
五、存取修飾詞
修飾詞 |
說明 |
存取範圍 |
public |
完全公開 |
任何地方 |
private |
私有 |
類別內部 |
protected |
受保護 |
類別本身與子類別 |
internal |
內部 |
同一組件 (Assembly) |
六、物件導向概念
6.1 三大特性
- 封裝 (Encapsulation):隱藏內部實作細節
- 繼承 (Inheritance):子類別繼承父類別特性
- 多型 (Polymorphism):同一介面不同實作
6.2 類別成員
- 欄位 (Field):類別的資料成員
- 方法 (Method):類別的行為
- 建構子 (Constructor):初始化物件
- this 關鍵字:指向當前物件的參考
6.3 變數解析順序
在方法內使用變數時,編譯器依序查找:
- 方法的區域變數
- 方法的參數
- 類別的欄位
當有命名衝突時,使用 this.
明確指定類別欄位
七、介面與設計原則
7.1 介面 (Interface)
- 只定義行為契約,不包含實作
- 用於降低耦合 (Coupling)
- 支援多型,不同實作可互換
- 便於測試 (可用假物件)
7.2 耦合 (Coupling)
- 高耦合:模組間依賴程度高,修改影響大
- 低耦合:模組間依賴程度低,修改影響小
- 介面可有效降低耦合
7.3 里氏替換原則 (LSP)
- 子類別必須能夠完全替代父類別
- 不違背父類別的承諾
- 提高可擴展性與維護性
八、泛型 (Generics)
8.1 泛型概念
- 型別的模板,先不指定具體型別
- 使用時再指定實際型別
- 編譯時型別綁定 (compile-time type binding)
8.2 泛型優點
- 省程式碼:一次邏輯支援多種型別
- 型別安全:編譯時期檢查
- 效能佳:避免 boxing/unboxing
8.3 IEnumerable<T>
- 能逐一列舉元素的集合介面
- 適合用來回傳資料的標準型別
- 通用且不綁死具體實作
九、專案與引用管理
9.1 專案結構
- bin/:最終輸出 (.exe, .dll)
- obj/:中繼檔案 (編譯過程暫存)
- 兩者都不應加入 Git
9.2 using vs 引用
- using:語法糖,省略完整命名空間
- 引用 (Reference):建立專案/DLL 依賴關係
- 必須先有引用,using 才有意義
9.3 引用方式
- 專案引用:開發階段方便同步更新
- DLL 引用:直接使用已編譯組件
- NuGet 引用:使用 <PackageReference>
9.4 編譯時 vs 執行時引用
- 編譯時:/reference 參數,型別檢查
- 執行時:Assembly.Load,動態載入 (用於 Plugin 架構)
9.5 NuGet
- .NET 的套件管理工具
- 類似 npm (Node.js) 或 pip (Python)
- Package Manager Console:Visual Studio 的 PowerShell 視窗
十、進階語法與特性
10.1 擴充方法 (Extension Method)
- 不改變原類別,新增方法
- 必須在靜態類別中定義
- 方法必須是靜態的
- 第一個參數使用
this
關鍵字
10.2 參數傳遞
- ref:已有值,要讓方法修改
- out:沒有值,要讓方法提供輸出
- 兩者都是參考傳遞 (pass by reference)
10.3 例外處理
- try-catch:捕捉例外
- Exception.Message:例外訊息
- Exception.StackTrace:呼叫堆疊
- int.TryParse:安全的型別轉換,失敗時 result = 0
十一、運算子與控制流程
11.1 運算子優先順序
括號 → 乘除 → 加減 → 比較 → 邏輯 → 左到右
11.2 邏輯運算子差異
運算子 |
短路 |
用途 |
&& / || |
是 |
邏輯運算 (bool) |
& / | |
否 |
位元運算 (int) 或邏輯運算 (bool) |
11.3 除法運算
- /:除法 (整數除法會捨棄小數)
- %:取餘數 (modulo)
- 整數運算會自動提升型別
11.4 三元運算子
- 語法:
condition ? value_if_true : value_if_false
- 必須有回傳值
- 在字串插值中使用時建議加括號
11.5 控制結構
- switch:case 必須接常量,最後必須 break
- continue:跳過本次迴圈,進入下一次
- break:跳出迴圈
- do-while:至少執行一次
十二、多執行緒
12.1 CPU 與執行緒
- 核心 (Core):CPU 的運算單元
- 超執行緒 (Hyper-Threading):一個核心模擬兩個邏輯核心
- 執行緒 (Thread):程序的最小執行單位
12.2 C# 多執行緒
- Thread:基本執行緒
- ThreadPool:執行緒池
- Task (TPL):平行程式庫,支援 async/await
十三、其他重要概念
13.1 Stack<T> vs CPU Stack
- Stack<T>:C# 的泛型資料結構
- CPU Stack:電腦硬體的記憶體區域
- 兩者都是 LIFO,但用途不同
13.2 靜態類別生命週期
- 不會被 GC 回收
- 存活到 AppDomain 卸載為止
13.3 Unicode
- 全球統一的字元編碼標準
- 每個字元有唯一編號 (code point)
- C# 的 char 使用 UTF-16 編碼
- 超過 U+FFFF 的字元需要代理對 (surrogate pair)
13.4 變數初始化
變數類型 |
必須初始化 |
預設值 |
局部變數 |
是 |
無 |
成員變數 |
否 |
0 / null / false |
靜態變數 |
否 |
0 / null / false |
十四、常用快捷鍵
- Ctrl+K, Ctrl+C:多行註解
- Ctrl+K, Ctrl+U:取消註解
- Ctrl+K:刪除該行