6
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main (string[] args)
        {
            var test1 = Test1(1, 2);
            var test2 = Test2(3, 4);
        }

        static IEnumerable Test1(int v1, int v2)
        {
            yield break;
        }

        static IEnumerable Test2 (int v1, int v2)
        {
            return new String[] { };
        }
    }
}

「test1」は、フィールドとしてv1およびv2(params)を持つIEnumerableのようであり、「Test1」は呼び出されません。

「Test2」は「設計された」動作をします:)

どうしたの?

4

2 に答える 2

15

Test1 呼び出されますが、結果を反復処理しない限り、でブレークポイントに到達することはありませんyield break

基本的に、あなたのためTest1に実装するステートマシンに変換さIEnumerableれます...しかし、メソッドの本体はすべてそのステートマシン内にあり、呼び出してから(またはループを使用して)ステートマシンを使用しない限り、表示されませんあなたの体は実行します。GetEnumerator()MoveNext()foreach

詳細については、私の一般的なイテレーターの記事イテレーターの実装の記事、およびEricLippertのブログ投稿の2つであるPsychicDebuggingpart1とPsychicDebuggingpart2を参照ください。

于 2009-09-24T13:28:55.333 に答える
1

Python について言及されたので、Python のジェネレーターは C# のジェネレーターと非常によく似た働きをすることを指摘しておきます。yield break単独で C# メソッドをジェネレーターに変換できるのに対し、Python に相当するものは変換できないというわずかな違いraise StopIterationがあります。

>>> def f():
...     print "Beginning of generator"
...     if False: yield
...     print "End of generator"
... 
>>> it = f()
>>> it
<generator object at 0x94fae2c>
>>> it.next()
Beginning of generator
End of generator
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
于 2009-09-24T14:03:05.793 に答える