2017-09-02 3 views
1

Ich möchte eine Liste erstellen, die einige Ereignisse speichert und Ereignishandler über die Liste an das Ereignis anfügt.Anfügen eines Ereignishandlers an ein in einer Liste gespeichertes Ereignis

Also mache ich ein List<dele> das Ereignis anEvent hinein hinzufügen, dann versuche ich, einen Event-Handler für dieses Ereignis zu befestigen, aber schließlich anEvent bekam noch keinen Event-Handler es angebracht ist, gibt das Programm True fest. Aber der Delegierte, der bei list[0] gespeichert wurde, erhielt den Lambda-Ausdruck.

public delegate void dele(); 

class Program 
{ 
    static event dele anEvent; 
    static void Main(string[] args) 
    { 
     List<dele> list=new List<dele>(); 
     list.Add(anEvent); 
     list[0]+=()=>{Console.WriteLine("BEEP!");}; 
     Console.WriteLine(anEvent==null); 
    } 
} 

Ist kein Referenztyp delegiert? Es scheint, dass sich eventhandler und list[0] auf verschiedene Objekte bezieht. Ich wundere mich warum.

Wenn ich möchte, dass anEvent ruft den Event-Handler, wenn ich den Handler an list[0] anfügen, was soll ich tun?

Danke!

+0

umgewandelt ??? – TaW

+1

Die Ausgabe ist falsch, ich habe es getestet –

+0

Delegaten sind Werttypen. – Enigmativity

Antwort

0

Ein Delegat ist im Grunde ein Vertrag für eine Methodenimplementierung. Ein bisschen wie eine Schnittstelle ist ein Vertrag für Klassenimplementierungen.

Die CLI (Common Language Infrastructure) Spezifikation besagt, dass delegates are reference types.

Ein Delegat ist ein Referenztyp, der verwendet werden kann, um eine benannte oder eine anonyme Methode einzukapseln. Delegierte ähneln Funktionszeigern in C++; Delegierte sind jedoch typsicher und sicher. Informationen zu Delegierten unter finden Sie unter Delegate und Generic Delegates.

Hier finden Sie aktuelle this Frage und haben auch einen Blick auf that ein.

Ich habe das Verfahren in einem nicht anonymen Verfahren zum Debuggen von Gründen _die Programm Ausgänge `True`_ Sure

public delegate void dele(); 
public static event dele anEvent; 

    static void Main(string[] args) { 
     List<dele> list = new List<dele>(); 
     list.Add(anEvent); 
     list[0] += Dele; 
     list[0].Invoke(); //this actually gets invoked and does not throw! 
     anEvent = list[0]; 
     Console.WriteLine(anEvent == null); //the output is false 
     anEvent.Invoke(); // this also gets s invoked and does not throw 
    } 

private static void Dele() { //this gets invoked 2 times as expected 
    Console.WriteLine("Beep"); // this gets printed after invoking the event 
} 
+0

Tut mir leid. Die Anweisung anEvent = list [0]; hätte nicht dort sein sollen. Ich habe es entfernt. Dann wird die Ausgabe Beep und True sein. Das heißt, ein Event hat Dele und list [0] nicht bekommen, finde ich es richtig? Aber warum? Delegat ist Referenztyp, warum hat list [0] und anEvent einen anderen Wert erhalten? –

+0

Ich denke, ich habe es. Wenn ich 'anEvent' an die' List.Add'-Methode übertrage, kopiert es den Delegaten tatsächlich in das Ereignis, und dann füge ich einen Ereignishandler an den in 'list [0]' gespeicherten Delegaten an, weil der Delegate ein unveränderlicher Typ ist Es wirkt sich nicht auf den Delegaten in "anEvent" aus, aus diesem Grund wird es nicht funktionieren. Ist das richtig? –

Verwandte Themen