2012-10-23 14 views
7

Hey Leute, ich habe in letzter Zeit C# und Veranstaltungen wurde mit alot aber ich beginne gerade meine eigenen Ereignisse zu erstellen und nutzen. Ich bin ein wenig verwirrt darüber, warum das Ereignis-Schlüsselwort zu verwenden, ich habe das gleiche Ergebnis nur mit Delegaten.Zweck des „Event“ Stichwortes

public partial class Form1 : Form 
{ 
    ServerConnection connection = new ServerConnection(); 

    public Form1() 
    { 
     InitializeComponent(); 
     connection.ref = new del(MethOne); 
     connection.ref += new del(MethTwo); 
    } 

    public void MethOne(object message) 
    { 
     MessageBox.Show((string)message); 
    } 

    public void MethTwo(object message) 
    { 
     MessageBox.Show((string)message); 
    } 

} 


public delegate void del(string message); 



public class ServerConnection 
{ 
    private TcpListener tcpListener; 
    public del ref; 

    private List<NetworkStream> clientList = new List<NetworkStream>(); 

    public ServerConnection() 
    { 
     this.tcpListener = new TcpListener(IPAddress.Any, 3000); 
     ThreadStart startListening = new ThreadStart(ListenForClients); 
     Thread startThread = new Thread(startListening); 
     startThread.Start(); 
    } 


    public void ListenForClients() 
    { 
     tcpListener.Start(); 
     ParameterizedThreadStart handleClient = new ParameterizedThreadStart(HandleClient); 

     while (true) 
     { 
      TcpClient newClient = tcpListener.AcceptTcpClient(); 
      Thread handleClientThread = new Thread(handleClient); 
      handleClientThread.Start(newClient); 
     } 
    } 


    public void HandleClient(object newClient) 
    { 
     NetworkStream clientStream = ((TcpClient)newClient).GetStream(); 
     clientList.Add(clientStream); 

     BinaryFormatter formatter = new BinaryFormatter(); 
     string message; 

     while (true) 
     { 
      message = (string)formatter.Deserialize(clientStream); 
      ref((string)message); 
     } 
    } 
+3

Oh mein ... das scheint eine vernünftige Frage zu sein. Warum runterstimmen? Warum schließt man es? –

Antwort

5

Das event Schlüsselwort können Sie add und remove Operationen inline mit der Erklärung angeben.

private Action _myEvent; 

public event Action MyEvent 
{ 
    add 
    { 
     Console.WriteLine("Listener added!"); 
     _myEvent += value; 
    } 
    remove 
    { 
     Console.WriteLine("Listener removed!"); 
     _myEvent -= value; 
    } 
} 
3

Der Zweck ist, zu identifizieren, was ein Ereignis ist und was nur ein Rückruf ist.

Beide scheinen dasselbe zu sein, aber die Bedeutung ist anders.

Auch Visual Studio stellt verschiedene Symbole Ereignisse anzuzeigen.

Wenn ich mich recht erinnere, ist es die frühen Tage von C#, die Delegierten haben das nicht unterstützen:

this.mydelegatefield += somethingHere; 

Nur Ereignisse ... aber kann es nur meine Phantasie.

EDIT

einfach nicht da missleading ... werden soll, ist der Unterschied von Add/Methoden entfernen. Ich stelle diese nach den anderen Antworten (da ich das vergessen habe). Also, Kredit ist nicht meiner.

8

Werfen Sie einen Blick auf

C# events vs. delegates

das Ereignis Schlüsselwort ist ein Modifikator für eine Delegatendeklaration die ermöglicht es, in einer Schnittstelle, Constraints es Aufruf von innerhalb der Klasse aufgenommen werden, die erklärt, es stellt sich mit einem Paar von anpassbare Accessoren (hinzuzufügen und zu entfernen), und zwingt die Unterschrift von der Beauftragte (wenn sie innerhalb des NET Framework verwendet).

+0

Oh, ja! Die Hinzufügen/Entfernen-Methoden. Das habe ich vergessen! –

0

Ereignis ist nur ein sugarcoat. 3 Dinge passieren, wenn Sie ein Ereignis definieren.

Einfach Beispiel:

public event EventHandler alarm; 

Beispiel Compiler Ausgabe

private EventHandler alarm 

public void add_alarm(EventHandler value) 
{ 
} 

public void remove_alarm(EventHandler value) 
{ 
} 

Hinweis private im Gegensatz zu Ihren public del me; öffentlichen Zugriffsmethoden kann zu Problemen führen. Außerdem ist get und set ein besseres Muster

0

Ereignisse können mit Eigenschaften Ihrer Klasse verglichen werden.

  • Eigenschaften sind Schnittstellen zu Ihren MemberField/Object-Zuständen.
  • Ähnliches Ereignis ist eine Schnittstelle zum zugrunde liegenden Delegaten.

können Sie immer noch das Endresult ohne Ereignis erreichen. Aber Sie verlieren Kapselung ohne Ereignisse.

Ein nicht geschützter Delegierter kann anfällig für Missbrauch sein.

Verwandte Themen