¿Es posible usar un delegado anónimo para devolver un objeto?Usar un delegado anónimo para devolver un objeto
Algo así:
object b = delegate { return a; };
¿Es posible usar un delegado anónimo para devolver un objeto?Usar un delegado anónimo para devolver un objeto
Algo así:
object b = delegate { return a; };
Sí, pero sólo mediante la invocación que:
Func<object> func = delegate { return a; };
// or Func<object> func =() => a;
object b = func();
Y, por supuesto, la siguiente es mucho más simple ...
object b = a;
En los comentarios, las excepciones cruzadas son mencionado; esto se puede solucionar de la siguiente manera:
Si el delegado es lo que queremos ejecutar de nuevo el hilo de interfaz de usuario de un hilo BG:
object o = null;
MethodInvoker mi = delegate {
o = someControl.Value; // runs on UI
};
someControl.Invoke(mi);
// now read o
O al revés (para ejecutar el delegado en un BG):
object value = someControl.Value;
ThreadPool.QueueUserWorkItem(delegate {
// can talk safely to "value", but not to someControl
});
y si estoy tratando de comparar 'a' con algún otro objeto dentro de un método en un hilo que no sea el hilo en el que' a' pertenece? Por ejemplo, 'void Test() {if (a == b) {}}' donde acceder a b desde este método causa una excepción de hilos cruzados. – wulfgarpro
@Wulfgar 'a' no" pertenece "a un hilo; pertenece a una instancia de clase (si es un campo), o es una variable de método. De cualquier manera, el compilador "capturará" la variable 'a' del alcance que declara el delegado; creando un tipo que encapsula la instancia del objeto "this" (para un campo), o la "variable" misma; citado porque luego * se convierte * en un campo. –
@Wulfgar: para obtener un hilo conductor, debe hacer el trabajo de la interfaz de usuario; sí, puede arreglar esto, pero "cómo" depende de qué bloque de código es el código de UI; ¿Puedes aclarar eso por favor? –
Sólo declaran algún lugar estas funciones estáticas:
public delegate object AnonymousDelegate();
public static object GetDelegateResult(AnonymousDelegate function)
{
return function.Invoke();
}
y en cualquier lugar lo utilizan como desea así:
object item = GetDelegateResult(delegate { return "TEST"; });
ni aun como este
object item = ((AnonymousDelegate)delegate { return "TEST"; }).Invoke();
using System;
public delegate int ReturnedDelegate(string s);
class AnonymousDelegate
{
static void Main()
{
ReturnedDelegate len = delegate(string s)
{
return s.Length;
};
Console.WriteLine(len("hello world"));
}
}
dónde viene 'a' viene? Además, su código existente simplemente asigna 'b' al delegado mismo. – BoltClock
@BoltClock - gracias por señalar el problema de asignación. – wulfgarpro
ver la actualización de su dolor cruzado –