C# 底層原理
由淺入深 · 12 篇筆記
L1C# 核心12 篇
格子滿了,就換一個兩倍大的(C# List<T> 與 Go slice)HTML
學會 List 和 slice 怎麼長大、為什麼 Add 平均 O(1),並親手重現 append 共用陣列的坑。
算出櫃號,直接去拿(C# Dictionary 與 Go map)HTML
學會雜湊表怎麼用 hash 直接找到資料、碰撞怎麼串起來、自訂 key 為什麼要同時覆寫 GetHashCode 和 Equals。
抽屜每格先貼好標籤,int 直接放進去(C# List<T> 與 ArrayList)HTML
學會泛型為什麼不會放錯型別,以及 ArrayList 存 int 為什麼又慢又吃記憶體。
先講好入場資格,方法裡才能用(C# where)HTML
學會用 where 告訴編譯器 T 有哪些能力,讓泛型方法能比大小、能 new。
值型別各翻一份,參考型別共用一份(.NET JIT,附 Go 對照)HTML
看懂 JIT 怎麼替泛型產生機器碼:值型別各一份、參考型別共用一份。
貓的名單能不能當動物名單用?HTML
弄懂 out/in:為什麼 IEnumerable<string> 能當 IEnumerable<object>,List 卻不行。
一份加總,int、double、decimal 都能用(C# INumber<T>)HTML
用 INumber<T> 寫一個給所有數字型別共用的 Sum<T>。
lambda 抓的是變數,不是值(C# closure,附 Go 對照)HTML
看懂 lambda 捕捉變數時產生的 closure,避開迴圈捕捉的陷阱與配置成本。
要一個才做一個(C# IEnumerable 與 yield return,附 Go iter.Seq 對照)HTML
看懂 yield return 變成狀態機:呼叫不跑、列舉才一步步跑。
LINQ 的成本(C# Where / Select / ToList)HTML
找出 LINQ 被重複列舉的地方,用 ToList() 只跑一次。
例外 vs 錯誤值(C# throw; 與 TryParse,附 Go 對照)HTML
分清 throw; 與 throw ex;,判斷該丟例外還是回傳錯誤。
值與參考、不複製的切片(C# struct 與 Span<T>,附 Go 對照)HTML
用 struct 與 Span<T> 避免不必要的複製和配置。