2009-08-31 4 views

Odpowiedz

33
public delegate bool Foo(DateTime timestamp); 

ten sposób zadeklarować delegat z podpisem opisujesz. Wszyscy delegaci są potencjalnie multiemisji, po prostu wymagają inicjalizacji. Takich jak:

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; 

Wywołanie fAll, w tym przypadku nazwałbym zarówno IsGreaterThanNow() i IsLessThanNow().

To, czego nie da się, daje dostęp do każdej zwracanej wartości. Wszystko, co dostajesz, to ostatnia zwrócona wartość. Jeśli chcesz pobrać każdą wartość, będziesz musiał obsługiwać multiemisję ręcznie, tak jak:

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

Każdy delegat może być multicast delegat

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

msdn

Przydatny własnością delegata obiektów jest to, że mogą one być przypisane do jednego delegata wystąpienie do multiemisji przy użyciu operator +. Skomponowany delegat dzwoni do dwóch delegatów, z których składał się . Tylko uczestnicy tego samego typu mogą składać się z delegatów.

Edycja: delagate ma metodę GetInvocationList która zwraca listę załączonych metod.

Oto wzmianka o Delegate invocation

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

Co dzieje się z wartościami zwracanymi przez delegata złożonego podczas jego wywoływania? Czy istnieje jakaś tablica, która pozwala sprawdzić wartości zwracane po ich wywołaniu? Używałem już delegatów multiemisji, ale nigdy nie myślałem, że mają typ zwrotny. – AaronLS

0

Natknąłem się na ten sam problem. Szukałem i znalazłem to w msdn.

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

Istnieją dwie metody na delegatów

  • BeginInvoke
  • EndInvoke

Link opisuje je szczegółowo, z próbkami kodu.

Możemy przechwycić te metody, aby obsłużyć wartości zwracane przez uczestników.