Effective C# 原則 28:避免轉換運算子(一)
轉換運算子與替代性 轉換運算子是替代性型別間操作轉換。替代性即一個類別可取代另一個類別。這可能是好事:衍生類別物件可被基類物件取代,經典例子為形狀繼承。先有形狀
Effective C# 原則 27:避免使用 ICloneable(一)
ICloneable 看似不錯實則麻煩 ICloneable 看起來不錯:實作介面即支援複製。不想支援複製就別實作。但物件不在「真空」環境運行,考慮對衍生類別影
Effective C# 原則 27:避免使用 ICloneable(二)
基類 Clone 無法正確支援衍生類別 執行程式發現 d2 為 null。雖 Derived 衍生自 BaseType,但繼承的 Clone() 無法正確支援
Effective C# 原則 26:用 IComparable 和 IComparer 實作物件順序關係(一)
物件順序關係與介面選擇 你的型別應有順序關係,便於集合中描述儲存與排序。.NET 框架提供兩介面描述物件順序關係:IComparable 與 IComparer
Effective C# 原則 26:用 IComparable 和 IComparer 實作物件順序關係(二)
隱式介面實作與型別安全比較 無法通過編譯,因公用 Customer.CompareTo(Customer right) 參數不匹配,而 IComparable.
Effective C# 原則 25:讓你的型別支援序列化(二)
非序列化成員的初始化責任 做為類別設計者,非序列化成員給你多添加工作。序列化過程中,序列化 API 不會為你初始化非序列化成員。因型別建構函式未被調用,成員初始
Effective C# 原則 25:讓你的型別支援序列化(三)
序列化流與鍵值對應 序列化流以鍵/值對應保存每個元素。預設特性產生程式碼以變數名為鍵儲存值。添加 ISerializable 介面後,必須匹配鍵名與變數順序(順
Effective C# 原則 24:優先選擇宣告式程式設計而非命令式程式設計(一)
宣告式與命令式程式設計 與命令式程式設計相比,宣告式程式設計用更簡單、清楚方法描述軟體行為。宣告式程式設計即用宣告定義程式行為,而非寫指令。C# 中(如大多數語
Effective C# 原則 24:優先選擇宣告式程式設計而非命令式程式設計(二)
通用比較器實作 同樣,你必須寫程式碼對集合排序,集合元素為添加 DefaultSort 特性的物件。用反射發現正確屬性,比較兩不同物件屬性值。好消息:只寫一次這
Effective C# 原則 22:用事件定義對外介面(二)
正確引發事件的模式 AddMsg 方法展示恰當引發事件方法。暫存日誌處理常式變數很重要,確保多執行緒情況下日誌處理常式安全。若無此參考副本,使用者可能在 if
Effective C# 原則 22:用事件定義對外介面(三)
事件記錄器實作範例 另一個類別直接輸出到系統事件日誌: class EventLogger { private static string eventS
Effective C# 原則 22:用事件定義對外介面(四)
事件通知多個感興趣的客戶端 事件在事情發生時通知任意多個對訊息感興趣的客戶。Logger 類別無需預先知道任何感興趣的物件。 大量事件時的事件處理常式集合 L
Effective C# 原則 21:用委派表示回呼
回呼的生活化範例 我:「兒子,到院子除草,我要看書。」 兒子:「爸,我已掃過院子了。」 兒子:「爸,草已放上除草機了。」 兒子:「爸,除草機啟動不了。」 我:「
Effective C# 原則 20:辨別介面實作與虛擬函式重載的差異(一)
介面實作與虛擬函式重載的根本不同 粗略看覺得實作介面與虛擬函式重載相同:定義物件,但物件在另一型別宣告。你被第一感覺騙了,兩者完全不同。介面定義的成員預設根本不
Effective C# 第三章:用 C# 表達你的設計意圖
C# 語言提供了一套新的語法,讓開發人員能夠清晰地表達設計意圖,方便團隊成員維護、擴展與使用軟體。所有 C# 類型都運行在 .NET 環境中,該環境對類型相容性
Effective C# 原則 19:優先定義與實作介面而非繼承(一)
抽象類別與介面的本質差異 抽象類別在繼承中提供通用「祖先」。介面描述可被其他型別實作的原子級泛型功能。各有千秋,卻不盡相同。介面是合約式設計:實作某介面的型別,
Effective C# 原則 19:優先定義與實作介面而非繼承(二)
CollectionBase 基類與介面實作 前程式碼建立整數陣列鏈表,用 IList 介面指標加入兩不同值。重載 OnInsert(),IntList 在加入
Effective C# 原則 19:優先定義與實作介面而非繼承(三)
介面限制公開功能、支援不相關型別共享功能 IListSource 讓使用者透過 GetList() 存取內容,ContainsListCollection 屬性