Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: blau en 16 de Septiembre de 2011, 01:00:53 AM

Título: Yield
Publicado por: blau en 16 de Septiembre de 2011, 01:00:53 AM
Simplemente escribo esto porque me he quedado prendado de la instruccion yield de C#, y por si alguien le viene bien usarla algun dia.

Conocía la instrucción y la había usado, pero de forma no creativa.

Ayer, necesitaba depurar un algoritmo de pathfinding, puufff... que tedio... me tenia que chupar 100 ciclos del algoritmo para poder llegar al punto que yo queria... y claro, cuando tienes un algoritmo planteado para completar todas las iteraciones en una sola llamada... pues si quieres cambiarlo tienes que pringar un poquito  con las variables y enmarranas un poco el codigo....

el caso es que me vino a la cabeza la instruccion yield,  en piss pass hice que el metodo devolviera un IEnumerable<int>  y añadi un yield return con el numero de ciclo y en seguida pude debuggear visualmente todo el proceso.


http://www.youtube.com/watch?v=QfJzqmhP_VI



IEnumerable CoreFind( )
{
    if ( Tree.Count == 0 ) yield break;
   
    int bucle = 0, a, b;
   
    do {
        Cell c = Tree.GetFirst( );
                ........
                ........ 
        bucle++;
        yield return bucle;
    } while ( Tree.Count > 0 );                 
}



void Update(float seconds)
{
    if ( !Debugging && MS_New.RightButton == ButtonState.Pressed && MS_Old.RightButton == ButtonState.Released ) {
        path_finding.Reset( );
        Enumerator = path_finding.Update( seconds ).GetEnumerator( );
        Debugging = true;
    }

    if ( Debugging )    {
       if ( Enumerator != null )  {
           if ( MS_New.LeftButton == ButtonState.Pressed || (KB_New.IsKeyDown( Keys.Space ) && KB_Old.IsKeyUp( Keys.Space )) ) {
               Logger.Write( "Ciclo {0}", Enumerator.Current );
               if ( !Enumerator.MoveNext( ) )  {
                    Enumerator = null;
               }
           }
        }
        if ( Enumerator == null )   Debugging = false;
    }
}





Título: Re: Yield
Publicado por: Vicente en 16 de Septiembre de 2011, 01:08:12 AM
yield es de las cosas menos conocidas de C# 2.0 :( Lo bueno es que con LINQ ya suena mucho mas.

Hoy mismo leia un artículo bastante gracioso donde se usaba para implementar fibras (o como se traduzca):

http://altdevblogaday.com/2011/05/25/implementing-fibers-in-c/

Que es basicamente mas o menos como se implementan las corrutinas en Unity.