- ベストアンサー
c# インターフェイスとデリゲートの違いと使い方について
- c#のIComparer<T>とComparison<T>はソートに使用されるが、デリゲートの方が使いやすい
- IComparer<T>とComparison<T>は互換性のために残されている可能性がある
- IComparable<T>は使われ方が異なり、重要性は衰えていない
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
IComparer<T>を使う場合は、比較の処理をクラスに閉じることが出来ます。これはIEqualityComparer<T>などと同時に実装することにより、単一のクラスがソートやハッシュテーブルで使用可能になる事を意味します(その他の非ジェネリックなインターフェイスも同時に実装しておけば、鉄壁でしょう)。 対象のT型の一般的な比較方法が使用者には分からない場合に、共通の実装としてこれらのインターフェイスを実装したクラスを提供すると、使用する側は単にこのクラスのインスタンスを使用すれば良いと分かるため、扱いやすいと思います。 しかし、これらのインターフェイスはクラスに実装して、更にインスタンスを生成しなければならないため、アドホック的な使い方には向かず、ラムダが使えなかったC#では、いちいち実装するのが面倒でした。 つまるところ、 ・用途がはっきりしている場合は、これらのインターフェイスを実装したクラスとインスタンスを提供することで、操作をやりやすくする ・やりたい事がその場限りの条件で決まる場合は、ラムダでさくっと記述する というように使い分ければ良いと思います。 なお、ラムダで書いてしまうと、テストがやりにくいという問題もあります。 #クラスで実装すれば、ユニットテストは書きやすいです。 IComparer<T>とIComparable<T>は、必要とするメソッドをクラスに内包するか否かということになりますが、T型の実装が複雑な場合は、IComparable<T>で実装するのは少し気が引けます(クラスの実装が複雑であるのに、単一のソート条件やハッシュ生成条件というのが現実的ではなくなることが多いため)。 IComparer<T>なら、文字列に対してデフォルトのソートを行うクラスや、大文字小文字を無視したソートを行うクラスのように使い分けが可能になります。
お礼
再びの回答ありがとうございます。 思ったより複雑なんですね。ためになりました。ありがとうございます。