Warum gibt es verschiedene delegate Typen & Events
-
Ich bin gerade dabei delegates und events mir an zu sehen,
und bin gerade ein wenig verwirrt dabei.Delegates:
Damit werden variablen zum aufnehmen von Methoden definiert. Z.B.:
Delegate void Notifier(string message);
Notifier notify;void JohnNotifyMePlease(string messageToJohn)
{
…
}notify = new Notifier(JohnNotifyMePlease);
notify += new Notifier(JohnNotifyMePlease);notify(“Nachricht”);
Dabei die erste Frage: Wozu muss ich bei der Zuweisung extra das „new Notifier()“ aufrufen.
Das ist mir unklar. Mit einer einfachen Zuweisung würde das doch auch klar sein oder wäre da zu wenig Info?Events:
Wo ist der unterschied bei den Events?
Eingesetzt werden sie doch genau so oder?Bei dem Beispiel von zB einem FileSystemWatcher( http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx )
Gibt es auch viele Event Handler:
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
Warum muss da beim zuweisen wieder verschiedene new() geben?
Dabei sind alle mit der gleichen Signatur „Method(object source, EventArgs e)“Übersehe ich da was?
-
JP_Abend schrieb:
Dabei die erste Frage: Wozu muss ich bei der Zuweisung extra das „new Notifier()“ aufrufen.
Intern ist es eine Liste von
Notifier
Objekten. Daher müssen entsprechende Objekte erstellt werden, welche dann in die Liste eingetragen werden. Tatsächlich kann das für dich allerdings der Kompiler übernehmen und du musst es nicht explizit hinschreiben. Folgendes geht somit problemlos:notify = JohnNotifyMePlease;
Im Hintergrund passiert dann aber eben doch ein:
notify = new Notifier(JohnNotifyMePlease);
JP_Abend schrieb:
Wo ist der unterschied bei den Events?
Eingesetzt werden sie doch genau so oder?Events haben spezielle Eigenschaften. Sie können zum Beispiel nur in der Klasse aufgerufen werden, welche das Event definiert hat. Das hilft bei der Kapselung und garantiert somit, dass niemand von Aussen selber das Event aufrufen kann. Auch kann sich etwas von ausserhalb der Klasse nur an- oder abmelden. Eine Zuweisung ist verboten, wodurch andere angemeldet Eventhandler von ausserhalb der Klasse nicht einfach so entfernt werden können. Sei es nur weil ein '+' oder '-' vor dem '=' vergessen wurde.
Aber auch bei Events ist ein explizites
new
nicht nötig. Auch hier kann es direkt der Kompiler übernehmen. Im Hintergrund wird es aber trotzdem passieren.Grüssli
-
Zu Events wäre noch zu sagen:
Events sind im Prinzip Delegate-Properties mit speziellen eigenschaften.
D.h. ein Event "kapselt" einen Delegate - das Rad wurde hier nicht 2x erfunden.
-
Zu erwähnen ist außerdem noch, daß bei Events Zuweisung (add) und Entfernen (remove) explizit nachverfolgt werden kann:
http://www.switchonthecode.com/tutorials/csharp-tutorial-event-accessors
Event Accessors
z.B. für Logging oder Debugging-Zwecke.P.S: Eigene Delegates sollte man nicht mehr deklarieren, sondern dafür die vordefinierten generischen Typen Action<...> und Func<...> benutzen. Die anderen sind noch Relikte aus .NET 1.x.
Einen umfangreichen Artikel dazu gibt es unter http://www.codeproject.com/Articles/117611/Delegates-in-C-Attempt-to-look-inside-Part-4
-
Danke, ich glaub das umfasst so c.a. was ich mir dachte/brauchte.
Th69 schrieb:
P.S: Eigene Delegates sollte man nicht mehr deklarieren, sondern dafür die vordefinierten generischen Typen Action<...> und Func<...> benutzen. Die anderen sind noch Relikte aus .NET 1.x.
Einen umfangreichen Artikel dazu gibt es unter http://www.codeproject.com/Articles/117611/Delegates-in-C-Attempt-to-look-inside-Part-4Ok.
Dass muss ich mir noch ansehen um das zu verstehen.
Gibts das auch kürzer
-
Th69 schrieb:
Zu erwähnen ist außerdem noch, daß bei Events Zuweisung (add) und Entfernen (remove) explizit nachverfolgt werden kann:
http://www.switchonthecode.com/tutorials/csharp-tutorial-event-accessors
Event Accessors
z.B. für Logging oder Debugging-Zwecke.Oha, interessant!
Ab welcher C# Version geht das?
-
Hallo hustbaer,
schon seit Anfang an (d.h. C# 1.0 bzw. 1.1): http://csharpindepth.com/Articles/Chapter2/Events.aspx (s. "A shortcut: field-like events")
-
Hier noch ein etwas offiziellerer Beweis, dass es seit 1.0 dabei war:
http://msdn.microsoft.com/en-us/library/8627sbea(v=vs.71).aspx#vclrfeventpgexample2Grüssli
-
Krass.
Wieder was neues gelernt, Danke euch beiden!Ich meine mich zu erinnern mal gelesen zu haben dass das eine Sache ist die man mit C++/CLI machen kann, mit C# aber nicht. Entweder meine Erinnerung betrügt mich da, und es ging um etwas anderes (vermutlich), oder der Artikel war falsch