6

まず、私はこの質問がこれらのSO質問の重複であるとは考えていません。

IList<T>ではなく常にIEnumerable<T>を返す必要がありますか? および戻り型としてのIEnumerable<T>

私たち全員が知っているように、いくつかの層を導入する主な目的は、結合を減らすことです。
データアクセス用のインターフェイスを定義する必要があり、BLはDAL実装の詳細を気にする必要はありません。言及された場合、インターフェースがIEnumerable<T>BLを返すと、それが単なる静的なIEnumerableものなのか、実行が延期されたものなのかがわかりません。同時に、この特定の詳細はパフォーマンスに大きな影響を与える可能性があり、実装に応じて異なるコーディングが必要になります。
さて、コレクションを数回繰り返す場合は.ToList()、それぞれを呼び出すことができます。IEnumerableただし、これにより、新しいリストのインスタンス化が不要になるため、静的コレクションのパフォーマンスが低下します。

だから私はどちらのアプローチが良いかを理解しようとしています。
より普遍的で潜在的にパフォーマンスが低いvsより結合された-よりパフォーマンスが高い。特効薬はないと思いますが、私が見逃した他のアプローチかもしれません。

4

3 に答える 3

8

だから私はどちらのアプローチが優れているかを理解しようとしています.

まず、これは興味深いトレードオフですが、この場合、関連するトレードオフは実際にはcorrect とwrong であると考えられます。これは、パフォーマンスの問題に確実に勝っています。通常、遅延実行クエリには、クエリの最新の結果が得られるという特性がありますが、呼び出すとクエリ結果の過去のバージョンのスナップショットToListが得られます。どちらかが正しくてどちらかが間違っている場合も確かにあります。

第二に、正確性の問題に対処し、実際にパフォーマンスのトレードオフがあると仮定すると、実際に行いたいトレードオフは、より普遍的で許容できないパフォーマンスと、より結合された許容可能なパフォーマンスです。許容できるパフォーマンスのものを選択します。

両方のパフォーマンスが許容範囲内であり、一方が他方より数ナノ秒遅いか、または他方よりも数バイト多くメモリを消費し、両方が正しい場合、どちらを選択するか誰が気にしますか? 他のことを考えて貴重な時間を過ごしてください。そして、どちらも許容できるパフォーマンスでない場合は、解決すべき大きな問題があります。

于 2013-01-28T16:31:17.203 に答える
2

概念的には、呼び出し元がメソッドの戻り型がaListであり、ではないことを知ることIEnumerableが重要である場合(たとえば、複数回反復しても悪影響がないことを知るため)、を返す必要がありListます。代わりにインターフェースを返すポイントは、「実装が何であるかは問題ではない」という言い方です。実装が重要な場合は、その特定の状況で)インターフェースを使用しないでください。

于 2013-01-28T16:23:27.780 に答える