2009-08-31 12 views

cevap

33
public delegate bool Foo(DateTime timestamp); 

hakkında bir referanstır. Tüm delegeler potansiyel olarak çok noktaya yayındır, basitçe başlatma gerektirirler. Mesela:

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; 

bu durumda IsGreaterThanNow() ve IsLessThanNow() hem çağırır, fAll çağrılıyor.

Bunun yapmaması, her dönüş değerine erişmenizi sağlamaktır. Tek ihtiyacınız olan son değer. Eğer her değerini almak istiyorsanız, bunu gibi elle noktaya yayını ele almak gerekecek:

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

herhangi temsilci bir çok noktaya yayın temsilci olabilir

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

msdn

temsilci yararlı bir özelliği bunlar bir temsilci atanabilir olmasıdır nesneleri örneği, çok noktaya yayın kullanarak + operatörü. Oluşturulan bir delege, 'dan oluşan iki delegeyi çağırır. Sadece aynı türde delegeleri oluşturulabilir.

DÜZENLEME: Bir delagate bağlı yöntem ile bir liste döndüren bir yöntem GetInvocationList sahiptir . İşte

Bu açıkladığınız imzası ile bir temsilci ilan etmek nasıl Delegate invocation

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

Bunu çağırdığınızda, oluşturulmuş bir temsilci döndürme değerlerine ne olur? Dönüş değerlerini çağırdıktan sonra incelemenizi sağlayan bir dizi dizi var mı? Daha önce multicast delegeleri kullandım, ama bir dönüş tipi olanları düşünmedim. – AaronLS

0

Ben aynı sorunu üzerine tökezleyerek edildi. Bunu aradım ve msdn olarak buldum.

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

  • EndInvoke
  • bağlantı ile kod örnekleri, ayrıntılı olarak bu açıklar delege

    • Beginınvoke iki yöntem vardır.

      Delegelerin dönüş değerlerini işlemek için bu yöntemlere bağlanabiliriz.