屬性是類別的對外介面,欄位是內部實作。公開欄位會暴露實作細節,導致未來修改困難。屬性提供封裝彈性,可在不破壞二進位相容性下變更內部邏輯。
| 特性 | const | readonly |
|---|---|---|
| 評估時機 | 編譯期 | 執行期 |
| 跨組件行為 | 值內嵌呼叫端組件 | 執行期讀取定義組件 |
| 效能 | 極快 | 略慢 |
| 彈性 | 僅限編譯期常數 | 可用 new、建構函式指派 |
| 版本控管 | 修改值視為介面變更 | 修改值視為內部實作變更 |
建議: 公開常數用 readonly,私有編譯期常數用 const。
as:失敗回傳 null,不拋例外,效能較佳is:型別檢查,可搭配模式比對 if (obj is int i)(T)obj:失敗拋 InvalidCastException,成本高is 可檢查值型別,as 僅限參考型別輔助工具:Type.IsAssignableFrom()(支援介面)、Type.IsSubclassOf()(僅類別繼承)。
#if 造成的空方法呼叫殘留與程式碼相依混亂void,確保程式行為不依賴回傳值預設 ToString() 僅回傳型別名稱。覆寫後可簡化資料繫結、除錯顯示、日誌記錄:
// 覆寫前:需手動建立顯示字串清單
var cusNameList = new ArrayList();
foreach (Customer c in customers) cusNameList.Add($"{c.ID} {c.Name}");
comboBox1.DataSource = cusNameList;
// 覆寫後:直接繫結物件集合
public override string ToString() => $"{ID} {Name}";
comboBox1.DataSource = customers; // 自動呼叫 ToString()
// 取得選取物件:一行搞定
Customer desCus = comboBox1.SelectedItem as Customer;