2009-08-31 9 views

Respuesta

33
public delegate bool Foo(DateTime timestamp); 

Ésta es la forma de declarar un delegado con la firma que usted describe. Todos los delegados son potencialmente multidifusión, simplemente requieren inicialización. Tales como:

public bool IsGreaterThanNow(DateTime timestamp) 
{ 
    return DateTime.Now < timestamp; 
} 

public bool IsLessThanNow(DateTime timestamp) 
{ 
    return DateTime.Now > timestamp; 
} 

Foo f1 = IsGreaterThanNow; 
Foo f2 = IsLessThanNow; 
Foo fAll = f1 + f2; 

Calling fAll, en este caso sería llamar tanto IsGreaterThanNow() y IsLessThanNow().

Lo que esto no hace es darle acceso a cada valor de retorno. Todo lo que obtienes es el último valor devuelto. Si desea recuperar todos y cada valor, que tendrá que manejar la multidifusión de forma manual, así:

List<bool> returnValues = new List<bool>(); 
foreach(Foo f in fAll.GetInvocationList()) 
{ 
    returnValues.Add(f(timestamp)); 
} 
2
class Test 
{ 
    public delegate bool Sample(DateTime dt); 
    static void Main() 
    { 
     Sample j = A; 
     j += B; 
     j(DateTime.Now); 

    } 
    static bool A(DateTime d) 
    { 
     Console.WriteLine(d); 
     return true; 
    } 
    static bool B(DateTime d) 
    { 
     Console.WriteLine(d); 
     return true; 
    } 
} 
3

Cualquier delegado puede ser un delegado de multidifusión

delegate bool myDel(DateTime s); 
myDel s = someFunc; 
s += someOtherFunc; 

msdn

Una propiedad útil de delegado objetos es que pueden asignarse a uno delegado instancia para ser multicast usando el operador + Un delegado compuesto llama a los dos delegados que se compone de . Solo delegados de se pueden componer el mismo tipo.

EDIT: A delagate tiene un método GetInvocationList que devuelve una lista con los métodos adjuntos.

Aquí es una referencia sobre Delegate invocation

foreach(myDel d in s.GetInvocationList()) 
{ 
    d(); 
} 
+2

¿Qué sucede con los valores devueltos de un delegado compuesto cuando lo invocas? ¿Hay algún tipo de matriz que le permita inspeccionar los valores de retorno después de que se invoquen? He usado delegados de multidifusión antes, pero nunca pensé que tuvieran un tipo de devolución. – AaronLS

0

me tropezar con el mismo problema. Busqué y encontré esto en msdn.

http://msdn.microsoft.com/en-us/library/2e08f6yc(v=VS.100).aspx

Hay dos métodos de delegados

  • BeginInvoke
  • EndInvoke

El enlace se describe en detalle, con ejemplos de código.

Podemos conectarnos a estos métodos para manejar los valores de devolución de los delegados.

Cuestiones relacionadas