public struct Customer : IComparable {
private readonly string _name;
public int CompareTo(object right) { // 非型別安全,需型別檢查、裝箱/拆箱
if (!(right is Customer)) throw new ArgumentException();
return _name.CompareTo(((Customer)right)._name);
}
}
排序 N 筆資料平均比較 N log N 次,每次 3 次裝箱/拆箱,效能損失顯著。
public struct Customer : IComparable {
// 隱性實作:僅透過 IComparable 參考存取
int IComparable.CompareTo(object right) {
if (!(right is Customer)) throw new ArgumentException();
return CompareTo((Customer)right);
}
// 型別安全公開版本:無裝箱,效能最佳
public int CompareTo(Customer right) => _name.CompareTo(right._name);
}
消費者呼叫 c1.CompareTo(c2) 直接使用型別安全版本;框架排序透過介面呼叫隱性版本,兩全其美。
public static bool operator <(Customer left, Customer right) => left.CompareTo(right) < 0;
public static bool operator <=(Customer left, Customer right) => left.CompareTo(right) <= 0;
public static bool operator >(Customer left, Customer right) => left.CompareTo(right) > 0;
public static bool operator >=(Customer left, Customer right) => left.CompareTo(right) >= 0;
確保運算子行為與 CompareTo 完全一致。
public struct Customer : IComparable {
private static RevenueComparer _revComp;
public static IComparer RevenueCompare => _revComp ??= new RevenueComparer();
private class RevenueComparer : IComparer {
int IComparer.Compare(object left, object right) {
// 型別檢查後比較 _revenue 欄位
return ((Customer)left)._revenue.CompareTo(((Customer)right)._revenue);
}
}
}
使用方式:customerList.Sort(Customer.RevenueCompare);
Equals 回傳 false 時,CompareTo 可回傳 0,完全合法。IComparable 定義自然順序。CompareTo 兼顧框架相容與效能。CompareTo。IComparer 並以靜態屬性暴露。