13

IListのインスタンスをパラメーター(または他のインターフェースですが、例として使用しましょう)として取るメソッドを作成したい場合はIList、型制約を使用してジェネリックメソッドを作成できます。例:

public static void Foo1<T>(T list) where T : IList
{

}

または、IListパラメータを直接受け取るメソッドを作成することもできます。

public static void Foo2(IList list)
{

}

すべての目的と目的で、これらのメソッドはまったく同じように動作するようです。

List<string> myList = new List<string>();
Foo1(myList);
Foo2(myList);

だからここに私の質問があります-これらの2つのアプローチの違いは何ですか?2番目のアプローチの方が少し読みやすいようです。他に知っておくべき違いはありますか(生成されるILの違いなど)?前もって感謝します。

4

5 に答える 5

12

いくつかの違い:

  • 再び実際の型が必要になった場合(たとえば、別のジェネリックメソッドに渡すため、またはロギングのため)、ジェネリックメソッドの方が優れています
  • T値型である可能性がありますが、それでも一般的な形式でボックス化されていないことになります。これが当てはまる可能性はほとんどありませんIListが、他のインターフェースの場合は非常に妥当です
  • 汎用形式では、実際のオブジェクトタイプとは異なる具体的な実装タイプを指定できます。たとえば、null参照を渡しても、どの実装タイプT
  • それらは異なる方法でJITされます。詳細については、ジェネリックに関するJoeDuffyの最近のブログ投稿を参照してください。

Tもちろん、それは実際に何をしているかによって異なります...メソッド内で実際に何かを知る必要がない限り、汎用フォームの唯一の利点はボクシングのポイントです。

于 2011-10-25T13:17:42.793 に答える
2

Foo2がvoidを返す場合、それは実際には問題ではありません。しかし、Foo2がリストの変更されたバージョンを返したと仮定します。IListパラメーターを使用すると、別のIListを返すことが最善の方法です。ただし、IList制約を使用すると、型がIListを実装していると仮定して、呼び出し元が必要とする任意の型を返すことができます。

于 2011-10-25T13:18:36.863 に答える
0

すべての下位レベルの影響は別として、リストがカプセル化され、それを変更する操作がある場合、オブジェクトについて話しているので、このリストは公開されるべきではありません(ほとんどの場合)。したがって、ジェネリックスの使用は無意味です。正当な理由なしに、クラスの内部動作を公開します。

リストを公開する必要のあるデータ構造がある場合、ジェネリックスでリストを指定すると、データの存在が読みやすくなる傾向があります(IMHO)。

于 2011-10-25T13:19:56.467 に答える
0

あなたの例を再考すると、私は2番目のアプローチを好みます。ジェネリックメソッドまたはクラスは、呼び出し元が例のように型以外でそれらを使用できる場合に主に使用されます。この場合、戻り値として基本クラス(eg object)を避け、タイプセーフな戻り値を提供できます。簡単なサンプルについて

public class Foo<T>
{
    public T GetSomething()
    {
        return default(T);
    }
}
于 2011-10-25T13:21:32.873 に答える
0

単純 :

ここでは、非常に簡単な例を示しました。すでにトップインターフェイスILISTを指定しているためです。

しかし 、

オブジェクトのインスタンスがあるとしましょう。

JimMorrison
JohnLennon
SnowieWhite

それらはすべてからILegendsです。

それらはすべて歌手オブジェクトです(var singer = new Singer())

YokOno 歌手でもありますが、そうではありません Ilegends(mmmm ...なぜだろうか?)

そしてあなたの関数は取ることができますSinger

しかし、あなたはILegenedsだけが有効であることを確認したいのです...だからここにあなたの答えがあります。

于 2011-10-25T13:25:02.283 に答える