2011-01-12 11 views
1

をバージョンが優れている:ジェネリック制約

using System; 

namespace Utils.Extensions 
{ 
    public static class EnumerableExtensions 
    { 
     public static bool Between<T>(this T item, T min, T max) where T : IComparable<T> 
     { 
      return item.CompareTo(min) >= 0 && item.CompareTo(max) <= 0; 
     } 
    } 
} 

または私は両方が動作するはずだと思う

using System; 

namespace Utils.Extensions 
{ 
    public static class EnumerableExtensions 
    { 
     public static bool Between<T>(this IComparable<T> item, T min, T max) 
     { 
      return item.CompareTo(min) >= 0 && item.CompareTo(max) <= 0; 
     } 
    } 
} 

、しかし、1つは私が使用する必要がありますか?

+1

"より良い"を定義します。より多くのpreformant?読みやすい?他に何か? – Oded

+0

私は彼らの性能の違いはごくわずかだと思います。私は優雅さや読みやすさについてもっと考えていました。 –

答えて

3

Tが値型の場合、2番目のバージョンを使用すると、itemがボックス化されることになります。値の型をインターフェイスにキャストするには、常にボクシングが必要です。

一般的にはこれについてあまり心配する必要はありませんが、ほとんどの場合、BCLのIComparable<T>実装はすべて値型です。あなただけが(小さな)ボクシングのオーバーヘッドが受け入れられるかどうかを決めることができます。

3

私は2番目の方が良いと思います。 IComparable ではないタイプの候補リストは、intelliSenseの候補リストを混乱させません。 (それはどんな場合でもありません)

あなたが探しているのはIComparableです。

あなたが選んでいるものが読みやすさであれば、2番目のアプローチを使用すれば十分です。

+1

これはTをIComparableを継承する型に束縛しているので問題にはならない ... –

+1

2番目のバージョンでは、値型であればボックス化され、IComparableではほとんどの 'IComparable 'フレームワークは価値型です。 (これは実際にOPにとって問題になるかどうかは、彼らが決定することであるかどうか。) – LukeH

-1

すべてのTについて何か言いますから、最初の1つを言います.2番目のものはIComparableであるはずです。確かに同じことをする必要がありますが、あなたが言うことを意味して、すべてのTはIComparableです。最初の方が良いです。

+0

'>'ビットは不正です。あなたの例は、C#とJavaの不自然なハイブリッドです。 – LukeH

+0

'C#'に 'extends'キーワードがありません。上記のコードはコンパイルされません。 – decyclone

+0

これは有効なC#ではありません。 –

2

2つの間に明らかな違いがあります。最初のものはIComparable<T>を実装する型で使用されることが期待されます.2番目の型はIComparable<T>での使用を意図しています。例Bへ

IComparable<int> x = 14; 
bool y = x.Between(12, 23); 

はコントラスト:あなたが最初の方法(一般的な制約)を例Aを使用しようとすると

int x = 14; 
bool y = x.Between(12, 23); 

、その後、あなたが得ようとしている例のA考える

制約にはIComparable<int>を実装する型が必要であり、IComparable<int>ではなく型が必要なため、コンパイラエラーです。

例Bは両方の手法を使用してコンパイルされます。私は両方の状況で同じように動作するように、2番目のテクニックを使用することをお勧めします。とにかく、おそらくこの理由のために大会と思われる。とにかく最初のものを使用するのを避けるべき他の理由があります。特定の型のメソッドをオーバーロードしたい場合は、2つ目の方法で柔軟性を高めることができます。

+0

おっと!私はこれを知らなかった。これはまた考慮すべきものです... –