19

リストを返すよりもyield returnを使用することで、同時実行性(現在または将来)があるかどうか、またはパフォーマンス上の利点があるかどうか疑問に思っていました。次の例を参照してください

処理方法

void Page_Load()
{
  foreach(var item in GetPostedItems())
    Process(item);
}

イールドリターンの使用

IEnumerable<string> GetPostedItems()
{
  yield return Item1.Text;
  yield return Item2.Text;
  yield return Item3.Text; 
}

リストを返す

IEnumerable<string> GetPostedItems()
{
  var list = new List<string>();
  list.Add(Item1.Text);
  list.Add(Item2.Text);
  list.Add(Item3.Text);
  return list;
}
4

1 に答える 1

41

このyield return例では、結果は の呼び出しごとに評価されますがIEnumerable.MoveNext、リストの例では、 が返される前にすべての結果が評価されます (キャッシングとインライン化が発生する可能性があるため、結果ごとにプロパティが評価されない場合があることIEnumerableに注意してください)。Textしたがって、列挙子への最初の呼び出しでパフォーマンスがわずかに向上し、プロパティが評価されるyield returnたびに後続の呼び出しでパフォーマンスがわずかに低下する可能性があります。IEnumerable.MoveNext

優れている点の 1 つは、yield return最初にリストを作成するモデルでは非常に非効率的または不可能な、無限シーケンス、ランダム シーケンス、およびその他のあらゆる種類の新しい列挙を返すことができることです。

簡単に言うと、 のインスタンスを返すには、Listを返す前にリスト内のすべての要素を評価する必要があります。IEnumerableyield returnIEnumerable

于 2008-11-16T16:44:34.273 に答える