Pregunta

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" Parece que hay un IEnumerable con v1 y v2 (params) como campos y "Prueba1" no se llama.

"Test2" funciona un "diseñado":)

¿Qué pasa?

¿Fue útil?

Solución

Test1 es llamada, pero a menos que iterar a través del resultado, no se alcanzó un punto de interrupción en yield break.

Básicamente Test1 se transforma en una máquina de estados que implementa IEnumerable para usted ... pero todo el cuerpo de su método es dentro de esa máquina de estados, ya menos que usar la máquina de estado llamando GetEnumerator() y luego MoveNext() (o usando un bucle foreach) no verá su cuerpo ejecutar.

generales Artículo iterador y mi iterador artículo aplicación para obtener más información, así como dos de las entradas del blog de Eric Lippert: depuración psíquico primera parte y psíquica de depuración parte dos .

Otros consejos

Ya que menciona Python, voy a señalar que los generadores en Python funcionan de forma bastante similar a los generadores en C #. No es sólo la pequeña diferencia de que yield break el único que puede transformar un método de C # en un generador, mientras que el equivalente del pitón de raise StopIteration no lo hará.

>>> 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top