Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Yield

Iniciado por blau, 16 de Septiembre de 2011, 01:00:53 AM

« anterior - próximo »

blau

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;
    }
}






Vicente

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.