閱讀《Effective C#》前幾個 Item 後,雖無《Effective C++》般震撼,仍收穫頗豐。以下整理前五條核心條款並加入個人心得。
屬性是類別的對外介面,成員是內部實現。暴露公共成員會綁死內部結構,未來修改極困難。屬性提供封裝彈性,可隨時加入驗證、延遲載入等邏輯。
關鍵差異:
const 編譯期替換為常值,跨組件引用時會硬編碼進呼叫端組件;readonly 執行期評估,靈活性高,效能稍遜;const 不能用 new 初始化;建議:除編譯期確定的真常數(如 Math.PI),其餘改用 readonly。
is/as 為「動態轉換」,失敗不拋例外,效能優於強制轉型;as 返回 null 而非拋例外,配合 null 檢查最安全;is 可判斷值類型,as 僅限參考類型;Type.IsAssignableFrom() 支援介面檢查,Type.IsSubclassOf() 僅限類別繼承。#if 可能導致空方法呼叫殘留、程式碼對編譯符號產生依賴。ConditionalAttribute 特性:
void,否則程式行為在不同建構下不一致。實例:將 Customer 列表綁定至 ComboBox。未覆寫 ToString() 時,需手動建立顯示字串清單並綁定,取值時還得解析字串;覆寫後直接綁定物件本身,取值一行搞定:
// 覆寫 ToString()
public override string ToString() => $"{ID} {Name}";
// 綁定
comboBox1.DataSource = customers;
// 取值
Customer desCus = comboBox1.SelectedItem as Customer;
好處:簡化 UI 綁定、移除字串解析邏輯、型別安全。