Effective C# 原則 8:確保 0 對實值型別是有效狀態(下)
列舉型別必須包含 0 值 // ❌ 錯誤:無 0 值 public enum Planet { Mercury = 1, Venus = 2, Eart
Effective C# 原則 7:選擇不可變的原子實值型別(一)
不可變型別定義與優勢 不可變型別:建立後狀態永不改變。優勢: 天然執行緒安全:無狀態變更,免鎖 適合做雜湊鍵:GetHashCode() 穩定 安全暴露:呼叫
Effective C# 原則 7:選擇不可變的原子實值型別(二)
可變結構的多執行緒與例外風險 a1.City = Ann Arbor; // City/State/Zip 不一致 → 暫態無效 // 若此時拋出例外(如 Z
Effective C# 原則 7:選擇不可變的原子實值型別(三)
建立不可變 Address 結構 public readonly struct Address { public readonly string Lin
Effective C# 原則 7:選擇不可變的原子實值型別(四)
可變結構的危隀:暫態無效狀態 var a1 = new Address(); a1.Line1 = 111 S. Main; a1.City = Anytown
Effective C# 原則 7:選擇不可變的原子實值型別(完)
防禦性複製:保護不可變型別內的參考型別欄位 public readonly struct PhoneList { private readonly Ph
Effective C# 原則 6:區別實值型別與參考型別(下)
記憶體配置差異實測 public class Container { private MyType _a = new MyType(); pri
Effective C# 原則 5:永遠提供 ToString()(中)
為何要覆寫 ToString() 除錯視窗顯示:Visual Studio 監看式、即時運算視窗呼叫 ToString() UI 控制項繫結:ListBox、
Effective C# 原則 5:永遠提供 ToString()(下)
IFormattable 進階格式化支援 實作 IFormattable 讓型別支援自訂格式字串: Name }; } } 自訂格式
Effective C# 原則 4:用條件屬性取代 #if 預處理器(上)
預處理器指令的問題 #if/#endif 可產生不同建置輸出,但濫用導致: 程式碼閱讀困難(灰色區塊、巢狀指令) 偵錯時呼叫堆疊混亂 編譯器無法分析灰色區塊內
Effective C# 原則 4:用條件屬性取代 #if 預處理器(下)
條件屬性實戰:偵錯驗證方法 0, caller, First Name cannot be blank); Trace.WriteLine(Exit
Effective C# 原則 3:優先用 is/as 而非強制轉型(一)
型別轉型的三種選擇 C# 是強型別語言,運行時型別檢查不可避免。面對 object 向下轉型,有三種寫法: as 運算子:安全轉型,失敗回傳 null is
Effective C# 原則 3:優先用 is/as 而非強制轉型(三)
強制轉型與 as 的核心差異:使用者定義轉型 as/is 只檢查執行時型別是否為目標型別或其衍生型別,忽略使用者定義轉型運算子。 強制轉型 (T)o 則會呼叫使
Effective C# 原則 3:優先用 is/as 而非強制轉型(四)
值型別無法使用 as object o = Factory.GetValue(); int i = o as int; // 編譯錯誤:值型別不可為 null
Effective C# 原則 2:常數優先用 readonly 而非 const(上)
兩種常數的本質差異 C# 提供兩種常數機制: 編譯時常數:const,值在編譯期確定,內嵌至呼叫端 IL 執行時常數:readonly,值在執行期(建構函式)
Effective C# 原則 2:常數優先用 readonly 而非 const(下)
IL 層面差異:編譯時常數 vs 執行時常數 const:編譯器將值直接內嵌至呼叫端 IL(ldc.i4),如同硬編碼。 readonly:執行時讀取欄位值(l
Effective C# 原則 1:優先使用屬性而非欄位(上)
核心原則 Always use properties instead of accessible data members. 設計類別時,盡可能使用屬性,而非公
Effective C# 原則 1:優先使用屬性而非欄位(下)
屬性的進階優勢 3. 執行緒同步化 屬性存取器內建同步邏輯,呼叫端無感知: private string _name; public string Name