Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda c#: Ambito de variables y delegados anónimos

Iniciado por blau, 25 de Septiembre de 2010, 12:16:06 AM

« anterior - próximo »

blau

              
Buenas,

estoy implementando un sistema de undo para un editor que estoy haciendo.

La idea es usar delegados anonimos y funciona bien :)

El tema es que para que funcione las variables que uso en el delegado anonimo tienen que estar definidas en el ambito de la llamada a la funcion, en este caso el Update() .

En este caso tengo una variable "beginCrono" definida en el ambito de la clase para guardar el valor inicial y cuando registro el Undo y el Redo, es cuando creo las dos variables que usaran los delegados en el ambito de la llamada a la funcion.

            if (controller.IsDragBeginning)
               {
                   beginCrono = selected.Crono;                    
               }
               else if (controller.IsDragging)
               {
                   OnMouseCursorMove(mousePos);
               }
               else if (controller.IsDragEnding)
               {
                   int EndDragCrono = selected.Crono;
                   int BeginDragCrono = beginCrono;
                   HelperUnDo.AddUndoRedo(delegate() { selected.SetCrono(beginCrono); }, delegate() { selected.SetCrono(EndDragCrono); });
               }
             

mi pregunta es mas por curiosidad que por otra cosa, ::), pero existe alguna forma de pasarle al delegado el valor de "beginCrono" o una copia, sin tener que crear una nueva variable?


Vicente

No, solo son capaces de acceder a variables dentro del ámbito donde están declarados.

blau

Cita de: Vicente en 25 de Septiembre de 2010, 12:54:06 AM
No, solo son capaces de acceder a variables dentro del ámbito donde están declarados.

???

class sinfuste
{
      int contador = 2;

      void SetValue(int value)
      {
            int contador2 = value;

            HelperUndo.AddUndoRedo( delegate() { contador = contador2; );

      }
}

Eso funciona. y el delegado esta declarado en el ambito de la funcion, ¿o te refieres al ambito de la clase?

contador es pasado al delegado por referencia y contador2 por valor.

Aunque quizas este yo un poco liado.



Vicente

Mmm estoy viendo tu primer código y ya le pasas una variable de fuera (beginCrono) que supongo será de clase. No puedes pasarle también selected.Crono sin la copia?

blau

si ese es el problema, que quiero pasarlo por valor y no por referencia.

si paso "selected.Crono" o "beginCrono", al ejecutar el delegado toma sus valores actuales y no los que tenia al crear el delegado, que es lo interesante.

si asigno sus valores a una variable del ambito de la funcion, es como si se pasaran por valor pues el delegado hace referencia a esa variable.

yo lo que quiero saber es si hay alguna forma de hacer esto sin asignar a una nueva variable. Una especie de funcion clone  o algun tipo de cast o palabra clave que cree una copia de la variable.