6

これら2つの方法の違いは何ですか?

最初:

public static int Foo<T>(T first, T second) where T:IComparable
{
    return first.CompareTo(second)
}

2番目:

public static int Foo(IComparable first, IComparable second)
{
    return first.CompareTo(second);
}
4

2 に答える 2

13

最初の方法では、2 つのパラメーターの型は同じでなければなりません (例:intと) int。型はインターフェイスを実装する必要がありIComparableます。

2 番目の方法では、2 つのパラメーターが異なる型を持つことができます。IComparable両方の型がインターフェイスを実装する必要がありますが、同じである必要はありません (例:intと) string

型が同じでない場合、 IComparable.CompareTo メソッドは例外をスローする可能性があることに注意してください。したがって、タイプ実際に同じであることを確認することをお勧めします。これを行うには、最初の方法を使用するか、ジェネリックIComparable<T> インターフェイスを使用するとさらに効果的です。


もちろん、フォローアップの質問は次のとおりです。これら2つの方法の違いは何ですか?

最初:

public static int Foo<T1, T2>(T1 first, T2 second) where T1 : IComparable<T2>
{
    return first.CompareTo(second);
}

2番目:

public static int Foo<T>(IComparable<T> first, T second)
{
    return first.CompareTo(second)
}

回答: 最初のメソッドは最初の引数をボックス化しませんが、2 番目のメソッドはボックス化します。

于 2013-01-21T10:48:40.990 に答える
1

コードフラグメントから、次のことが言える違いが提供されました。

ジェネリック バージョン:

  • ジェネリックの場合、定義されたすべてのタイプに対して新しいコードが生成されます

Foo<Class1>, Foo<Class2>, Foo<Class3>.

  • コンパイル時に型を定義する必要があります

インターフェースのバージョン:

  • 実際のコードから実装の詳細を隠して、OOP の概念の恩恵を受けます。

  • 実行時の型定義 (柔軟性が高い) ですが、その言葉の純粋な意味という点で「一般的」ではありません。

一般的に:インターフェイス バージョンはより柔軟ですが、一般的ではありません (ちなみに、すべては具体的なコードの実装に自然に依存します)。

于 2013-01-21T10:49:49.550 に答える