2017-10-03 5 views
0

私は、IEnumerator(Listという)を格納するデータ構造を持ち、すべての列挙子でMoveNext()を呼び出す毎tミリ秒のクラスのインスタンスを持っています。C#IEnumerator暗黙的なメモリ割り当て

また、IEnumeratorをデータ構造体に追加する「void Add(IEnumerator en)」メソッドがあります。

私はこのフォームのIEnumeratorをする方法がある場合:

IEnumerator MyMethod() 
{ 
    code(); 
    yield return something(); 
    code(); 
} 

を私は

instance.Add(MyMethod()) 

呼び出したときに何が割り当てられますでしょうか?

+0

メモリが内部的に割り当てられている場合にのみ追加がサポートされます。そうでない場合は、列挙子は読み込みのみを行い、フォワード操作を実行します。リストは –

+0

のようなコレクションです。 'MyMethod'は 'IEnumerable'そのオブジェクトは返される前にある時点で割り当てられなければなりません。 –

答えて

1

yield returnステートメントは、フードの下にステートマシンを作成するので、メソッドを呼び出すと、実際にメソッドMyMethodが呼び出されず、ステートマシンオブジェクトが呼び出されます。

あなたが何かを呼び出すときは、IEnumeratorをを取得します:あなたは、あなたは、メソッドが呼び出されたことがないされて表示されますMyMethodは上の休憩を置くのではなくIEnumeratorを、それを介して作成されている場合は

Program p = new Program(); 
var enumerator = p.MyMethod(); 

を。

これで、列挙子にMoveNextを呼び出すと、実際にそのメソッドが呼び出されます。

あなたのケースでは、リストは列挙子を保持し、実際にオブジェクトを取得すると実際の呼び出しが遅れます。

メモリ割り当てに関しては、ステートマシンは実際に割り当てられますが、MyMethod内で作成されるすべてのオブジェクトはまだ割り当てられません。

関連する問題