3

オブジェクトのリストを返すいくつかの関数を持つクラスを設計しています。オブジェクトをウォッチウィンドウで表示できるため、にIEnumerable<T>変換するとデバッグが容易になることに気付きました。List<T>ただし、これがベストプラクティスであるかどうかはわかりませんIEnumerable

Q:どちらが良いですか?

public IEnumerable<MyData> GetData()
{
    return Foo();
}

public IEnumerable<MyData> GetData()
{
    return Foo().ToList();
}
4

7 に答える 7

5

良い習慣-正当な理由/必要がない限り、仕事をしないでください。したがって、特別な理由がない限り、IEnumerable<MyData>ToList()/ ToArray()を呼び出さずに戻るだけです。

考えられる理由:

  • 関数は、潜在的に遅延した列挙の評価を完了することを約束します
  • 結果が複数回列挙されることを期待します
于 2012-09-20T07:52:07.047 に答える
2

IEnumerable<..>よりジェネリック型としてより良いリターン。発信者がそれをどうするかを決めることができた後。あなたの場合、あなたIEnumerable<..>は両方の場合に戻るので、実行する理由はありませんToLIst()、ただ戻るIEnumerable

于 2012-09-20T07:49:51.663 に答える
1

それは本当にあなたの要件に依存します。メソッドシグネチャのリターンタイプも、そのメソッドのコントラクトの一部です。IEnumerableを返すメソッドは値のストリームを示し、List(またはより抽象的なコレクション)を返すメソッドは可変の値のコレクションを返します。

私は通常、次の慣行についていくようにしています。

  • 値の数に関する固定知識がない場合、またはすべての値のロードにかなりの時間/リソース(クエリ結果など)がかかる場合は、IEnumerableまたはIObservableを使用してデータをストリーミングしてみてください。
  • 変更可能であってはならない事前にわかっている固定セットの配列を使用します。
  • 変更可能な事前にわかっている固定セットには、ICollectionを使用します。
于 2012-09-20T07:51:07.867 に答える
1

廃棄される作業単位を使用している場合は、要素のリストを使用することをお勧めします。これは、一度廃棄されると、後で要素を取得できなくなるためです。

他のすべての場合は、柔軟性が高いため、汎用のIEnumerableを返すことができます。

結局のところ、それはすべてあなたの要件に帰着します。IEnumnerableは、変数への割り当ての正確な瞬間ではなく、列挙されたときに要素を取得することに注意してください。

于 2012-09-20T07:51:52.330 に答える
1

IEnumerable<T>は呼び出し元にTのコレクションのコントラクトを提供しています。ただし、IList<T>またはを使用するList<T>場合は、要素を直接追加または削除できることを提案しています(クラスの実装にあるAddやRegisterなどのメソッドを経由せずに)。呼び出し元が「アイテム」を表示できるようにすることが目的の場合は、IEnumerableの方が適しています。

100%ではありませんが、IEnumerableの戻り値は読み取り専用のコレクションと見なされます。

デバッグのしやすさは、優れた設計に次ぐものでなければなりません。実行時に内部を覗くことができることに依存するのではなく、単にクラスを単体テストすることをお勧めします。ただし、ほとんどの場合、デバッガーは最初の項目として「base」クラスを表示します。したがって、IEnumerableの最初の項目は、実際に内部で使用しているリストです。メンバーを見るのにもう1つ「展開」するだけです!

于 2012-09-20T07:58:24.093 に答える
0

IEnumerableを返すと、呼び出し元は結果をどう処理するかを決定できます。つまり、結果を列挙するか、現時点では列挙せずに他の何かに渡すことができます。ToList()は、この時点でデータを強制的にリストに入れ、呼び出し元に渡します。

したがって、-IEnumerableの方が2つのうちで優れている可能性があります-ただし、デバッグ時にToListを使用する方が簡単な場合があります。

于 2012-09-20T07:52:18.887 に答える
0

簡単なルールがあります:より多くのconcretteを返し、より一般的なものを受け入れます。

戻り値が実際の場合はIEnumerable<>、そのまま返します。しかし、決してそれをしないでください:

public IEnumerable<MyData> GetData()
{
    return this.list; // list = new List<MyData>();
}

上記のコードは、必要なしに発信者を制限します。それはリストになり、発信者はとにかくそれをリストにキャストしてクリアすることができます。

于 2012-09-20T13:26:31.630 に答える