IEnumerable
を繰り返し処理するたびに異なるオブジェクトを生成するファクトリとして使用しようとしています。彼らはできるだけ早くGC'edする必要があります。ただし、は列挙子への参照を保持していますので、再度呼び出すことができます。だから、私たちのプログラムは、基本的に次のようになります。"yield"を使用すると、コンパイラ生成型がIEnumerableとIEnumeratorの両方を実装する理由
public class YieldSpec
{
public static IEnumerable<string> Strings()
{
yield return "AAA";
yield return "BBB";
yield return "CCC";
}
public void YieldShouldAllowGC()
{
var e = Strings();
foreach (var a in e)
{
Console.WriteLine(a);
}
}
}
は、デバッガにそのコードを見てみると:
あなたはブレークポイントにヒットしたときのIEnumerableが「CCCへの参照を持っていることがわかります"。
これは実際には起こりません。 IEnumerableは、GetEnumeratorが呼び出されたときにのみIEnumeratorを生成する必要があります。 IEnumerableに状態が含まれることが予想される動作ですか?
私はそれを再現できません。もちろん、すべてのインスタンスを廃棄しましたか? [this code](https://dotnetfiddle.net/M4AdN8)を使用します。 –
インスタンスを「テスト」から削除しましたか?あなたが 'Test'を投げるまで、全体を処理しません。 (それは怠惰です) –
AFAIKは 'Test()'(あるいはもっと具体的には、 'foreach()'の後にスコープを残しているので、列挙子はガベージコレクションの対象になります。何が問題ですか?それは_Directly_ 'Test()'を呼び出した後、GCはまだ起動しませんでしたか? – CodeCaster