2012-04-02 19 views
8

Bu durumda neler olup bittiği tam olarak belli değil.Birisi sahnelerin ardında neler olduğunu açıklayabilir mi?

Her iki işlevin de tetiklenmesini beklerim.

Ya EventHander sınıfı, bir dizi olarak tetiklenecek işlev listesini saklıyor - ve her şey eklendiğinde/kaldırıldığında dizi yeni bir kopyaya kopyalanıyor - veya atama yapıldığında, her şey kopyalanacak Yeni bir "koleksiyon" - sadece referans değil.

Biri beni aydınlatmak lütfen: D

İşte biraz linqpad senaryo var:

public class Moop 
{ 
    public EventHandler myEvent; 
} 

void Main() 
{ 
    var moo = new Moop(); 
    moo.myEvent += (o, sender) => { "Added to Moop #1".Dump(); }; 

    var moo2 = new Moop(); 

    //Copy the reference, I assume? 
    moo2.myEvent = moo.myEvent; 

    moo2.myEvent += (o, sender) => { "Added to Moop #2".Dump(); }; 

    //Fire the event on #1 
    moo.myEvent(null, null); 
} 
+0

Operatörün aşırı yüklenmesi ve getirdiği kötülüklerin gücü. – CodingBarfield

cevap

8

Olay işleyicisi listeleri delegeler, ve delegeler iletmenin - dizeleri gibi. Yani, temsilci kopyalayın ve ikinci olay işleyicisi, ilk değil, ikinci delege "eklenir".

Sen http://www.c-sharpcorner.com/uploadfile/Ashush/delegates-in-C-Sharp/

İyi şanslar delegeleri hakkında daha fazla bilgi bulabilirsiniz!

+0

Daha doğrusu, ikinci 'Moop 'delege örneği orijinal değerinin birliği ile değiştirilir (" Moop # 1'e eklendi ") ve ikinci olay işleyicisi (" # Moop # 2'ye eklendi "...). Böylece, + = ... yaptığınızda soldaki değeri değiştiriyorsunuz. Ancak bu cevabın özü doğrudur. –

+0

Gerçekten. Bu yüzden tırnaklar arasına "eklendim" ifadesini yerleştirdim. –

+2

Bunu biraz daha açık hale getirmek için (söylediğiniz hiçbir şeyle çelişmemek için), “delegate + = newDelegate;” kabaca = delegate = Delegate.Combine (temsilci, yeniDelegate); ve bundan daha yeni bir temsilci olması çok daha nettir. alana atanır. – hvd

İlgili konular