Ktouth Brand. on Web

け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト



[2010年02月08日]

.net 2.0以降における比較関係の機能はややこしい?

2010年02月09日 03:43更新 筆者:K.Ktouth

今日、コードを書いていた時にふと思ったこと。
Compar ... と付くインターフェイス等がいくつもあるのなはず
いったいどこでどれをどう使うべきなのか、ちょっと混乱したので軽くまとめてみる。

IComparable型固有の汎用の比較メソッドを提供するインターフェイスint CompareTo(object obj)
IComparable<T>型固有の特定の型に対する専用の比較メソッドを提供するインターフェイスint CompareTo(T obj)
IComparer二つのオブジェクトの汎用の比較メソッドを提供するインターフェイス
既定の実装 Compare が存在する
int CompareTo(object x, object y)
IComparer<T>二つの特定の型に対する専用の比較メソッドを提供するインターフェイス
既定の実装 Compare<T> が存在する
int CompareTo(T x, T y)
Comparison<T>二つの特定の型に対する専用の比較を行うデリゲートint CompareTo(T x, T y)

つまり、ある型 T があるとして……

  • T 自身が(既定の)自身との比較機能を提供するために使用するのが IComparableIComparable<T>
  • 二つの T のインスタンスを独自の手段で比較する機能を提供する型 C が使用するのが IComparerIComparer<T>
  • T 自身が持つ IComparableIComparable<T> を使って比較する機能を実装・提供するのが Comparer.DefaultComparer<T>.Default
  • 型を作成することなく簡単に IComparer<T> と同じ機能を提供するのが Comparison<T> デリゲート
  • Comparison<T> デリゲートに既定の比較手段を渡したいときには Comparer<T>.Default.CompareTo を使用する。

文章にしてようやく理解した感じあせ
実際に比較機能を提供する場合は同値判定、つまり やはり多岐にわたっている Equal ... 関係機能および演算子オーバーライドの検討も必要とのことらしい。
つーか、一つにまとめてくれ……(笑)

本日のリンク元
アンテナ
その他のリンク元
検索