これら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);
}
最初の方法では、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 番目のメソッドはボックス化します。
コードフラグメントから、次のことが言える違いが提供されました。
ジェネリック バージョン:
Foo<Class1>
, Foo<Class2>
, Foo<Class3>
.
インターフェースのバージョン:
実際のコードから実装の詳細を隠して、OOP の概念の恩恵を受けます。
実行時の型定義 (柔軟性が高い) ですが、その言葉の純粋な意味という点で「一般的」ではありません。
一般的に:インターフェイス バージョンはより柔軟ですが、一般的ではありません (ちなみに、すべては具体的なコードの実装に自然に依存します)。