Laden...

Events, Delegates und deren Zusammenhang

Erstellt von frisch vor 18 Jahren Letzter Beitrag vor 18 Jahren 6.769 Views
frisch Themenstarter:in
2.082 Beiträge seit 2005
vor 18 Jahren
Events, Delegates und deren Zusammenhang

Hallo,

erstmal sorry aber ich verstehe das einfach nicht, was Delegates und Events betrifft. Für was sie erstellt werden und was sie bewirken ist mir klar, nur begreife ich einfach nicht, wie man diese deklariert usw.

Habe mir jetzt schon mehrmals den Part über Delegates in meinem Buch durchgelesen doch scheinbar setzt hier meine Logik aus.

Ich möchte gerne wissen, wie Events erstellt werden, wie man diese mit Objekten verknüpft usw.

Hat jemand Beispiele, Tutorials o. ä. zur Hand? Wäre toll.

Danke.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

100 Beiträge seit 2005
vor 18 Jahren
[TEIL1] RE: Events, Delegates und deren Zusammenhang

Naja ein delegate ist wie ein "Function Pointer in C++" wie alle immer sagen..

Leider habe ich nie C++ programmiert 🙂

Ein delegate ist im grunde genommen nichts anderes als eine Variable, also ein Platzhalter.

Während String ein platzhalter für einen Text, Integer ein Platzhalter für eine Zahl oder System.Drawing.Rectangle ein Platzhalter für ein Rechteck ist, sind DELEGATES Platzhalter für bestimmte methoden.y

Sie ermöglichen es also eine Methode aufzurufen ohne ihren eigentlichen Namen im vorhinein zu kennen. Die Methode wird dem delegate erst zur Laufzeit zugewiesen...

Einiges muss im vorhinein aber definiert sein.. Wie sieht die Signatur der Methode aus: Wie ist ihr Rückgabewert, wie sind ihre Parameter?!

Also ist ein Delegate ein Platzhalter für eine Methode mit einer bestimmten Signatur.

Du kannst einen delegate so definieren:


delegate returnvalue delegateName(parameter)

also zb:


delegate void WriteStringDelegate(string writeString);

delegate bool ExecuteDelegate(IDbCommand cmd);

willst du den delegate jetzt in einer klasse verwenden schreibst du:


public class MyStringWriter{
	public WriteStringDelegate WriteMethod;
}

Jetzt kannst du von die neue Klasse so verwenden:


public static void main()
{
	MyStringWriter writer = new MyStringWriter();
	writer.WriteMethod = new WriteStringDelegate(ConsoleWriteMethod);

	writer.WriteMethod("Hallo Welt");
}

public static void ConsoleWriteMethod(string text){
	Console.WriteLine(text);
}

public static void FileWriteMethod(string text){
	//Write to file here...
}

public static int DbWriteMethod(StringBuilder text){
	//do something here
} 

In dem Beispiel hängst du ConsoleWriteMethod an den WriteMethod delegate und rufst nachher den WriteMethod delegate auf (also in die ConsoleWriteMethod die dahinter steht).

Da sie die gleiche Signatur hat könntest du statt ConsoleWriteMethod genauso auch die FileWriteMethod dem delegate zuweisen, aber NICHT die DbWriteMethod (hat ja ganz andere signatur).

5.941 Beiträge seit 2005
vor 18 Jahren

Habe dasselbe Verständnissproblem wie frisch.
Leider kann man so viele verschiedene Dinge mit delegates und Events anstellen, das die Beispiele immer x anders aussehen.

Das Beispiel in der Doku zu delegates und Events ist ein Paradebeispiel für ein "schlechtes" Beispiel 8o

Vielleicht wäre ein Beispiel gut, bei dem z. B. eine Methode einer anderen Klasse einen Event auslöst und in der Hauptklasse bzw. in eine Methode der Hauptklasse danach etwas durchführt, sobald der Event gefeuert wird...

herbivore mag sich vielleicht noch an mein Event "Problem" errinnern.

Aber das delegates etwas sind wie Funktionszeiger in C++ bringt mich vielleicht schon ein Stück weiter, da meine Schwester mit C++ arbeitet... vielleicht kann sie mir dass ein bisschen erkären 🙂

Vielen Dank für die Mühe

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

100 Beiträge seit 2005
vor 18 Jahren
[TEIL2] RE: Events, Delegates und deren Zusammenhang

..weiter gehts..

Delegates sollte vom prinzip klar sein..

Events sind jetzt eine weiterführung von delegates.. Multicast delegates.. Das heißt du kannst an ein Event nicht nur eine Method mit gleiche Signatur sondern beliebig viele anhängen und auch wieder abhängen.. mit += oder -=

Man braucht dazu wieder einen Delegate...

Um beim Beispiel von vorher zu bleiben:


public class MultiCastWriter{

	public event WriteStringDelegate WriteStringEvent;

	public void OnWriteString (string writeString){
		if (WriteStringEvent != null){
			this.WriteStringEvent(writeString);
		}
	}
}

...
MultiCastWriter myWriter2 = new MultiCastWriter();

myWriter2.WriteStringEvent += new WriteStringDelegate(ConsoleWriteMethod);
myWriter2.WriteStringEvent += new WriteStringDelegate(FileWriteMethod);

myWriter2.OnWriteString("Beispieltext");

Rufst du jetzt onwritestring auf, so werden alle verbundenen delegates aufgerufen (also Console und FIleWriteMethod).

Du kannst delegates auch wieder abhängen mit -= new WriteStringDelegate(...)

Ich hoffe das ganze ist jetzt ein bisschen klarer.

OnWriteString sollte normal protected und nicht public sein, damit man nur von innerhalb der klasse das event auslösen kann..

Die syntax hier betrifft 1.0 und 2.0 framework.

Im 2.0 framework gehts sogar noch schneller, indem du nur schreiben musst:


myWriter2.WriteStringEvent += FileWriteMethod;

bzw.

myWriter1.WriteStringMethod = FileWriteMethod.

lg,
kakaomilch.

871 Beiträge seit 2005
vor 18 Jahren

Hallo frisch,

ich hab mal vor etlicher Zeit ein paar Beispiele online gestellt da ich anfangs auch immer probleme hatte gedanklich den roten faden von delegates und events zu verstehn:

http://www.systemv.net/csharp/

Vielleicht helfen sie dir weiter!

Grüsse, Egon

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Peter Bucher,

herbivore mag sich vielleicht noch an mein Event "Problem" errinnern. FTP Upload mit Progressbar 🙂

herbivore

5.941 Beiträge seit 2005
vor 18 Jahren

Ja genau Herbivore 🙂

Nur, hab ichs leider immer noch nicht begriffen, jetzt sollte dann mal mein bestelltes Buch kommen. Vielleicht wirds dann ein bisschen verständlicher.

Aber vielleicht könntet ihr mir erklären was für verschiedene Kombinationen / Möglichkeiten es gibt Events und Delegates zu benutzen / zusammen zu benutzen.

Nur mit Delegates kann man ja auch schon einiges anstellen, so wie ich gesehen habe...

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

100 Beiträge seit 2005
vor 18 Jahren

Das hängt davon ab, ob du eine Methode ansprechen willst (dann nimm delegate) oder beliebig viele (das geht mit einem event).

In der Praxis nimmst du Events als callbacks...

z.B: du machst ein Model-View-Controller pattern...
(Siehe mein Posting in diesem Thread)

Da machst du einen Controller und eine View (=Form oder UserControl).

Du möchtest vom Controller aus allen betroffenen Views sagen, das sich Daten geändert haben. Da der Controller aber nicht weiß, wen das alles interessiert, bietet er einfach nur ein DataChanged event an.

An das kann sich jeder subscriben und wenn die Daten geändert wurden, wird es gefeuert. Jeder subscriber kann dann individuell darauf reagieren.

Schau dir das beispiel mal an, bzw. probier es selber aus...

lg,
kakaomilch.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo kakaomilch,

Das hängt davon ab, ob du eine Methode ansprechen willst (dann nimm delegate) oder beliebig viele (das geht mit einem event).

nein, das ist nicht der Unterschied! Auch Delegaten können multicast sein. Der Unterschied ist, dass ein Delegat ein (in der Regel public) Feld ist und ein Event ein (private) Feld mit (in der Regel public) Properties (add und remove) zum Zugriff auf das Feld.

Siehe auch SerializationException wegen Observer

herbivore

frisch Themenstarter:in
2.082 Beiträge seit 2005
vor 18 Jahren

Danke erstmal an alle. Das mit den Delegates ist mir jetzt einigermaßen klar, was mir allerdings immernoch Fragen aufwirft, ist folgendes.

An events kann man also Methoden ranhängen, soweit habe ichs verstanden. Sind aber die events vordefiniert, oder muss man diese selbst schreiben also bestes beispiel ist die OnTextChanged bei der Textbox. Diese ist ja scheinbar vordefiniert, kann man jetzt so einen Event für einen normalen String schreiben?

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo frisch,

OnTextChanged ist kein Event, sondern die den Event auslösende Methode. TextChanged ist der Event. TextChanged ist in der Klasse Control (vor-)definiert.

Wie man eigene Events definiert steht z.B. in Problem mit EventHandler .

Einen Event für Strings kann man nicht schreiben, weil der Event in der jeweiligen Klasse definiert werden muss. Und da die Klasse String nicht von dir geschrieben ist, kannst du sie auch nicht ändern. Und da String sealed ist, kannst du noch nicht mal eine Klasse von String ableiten, um dort einen Event zu definieren.

herbivore

0
767 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
Einen Event für Strings kann man nicht schreiben, weil der Event in der jeweiligen Klasse definiert werden muss. Und da die Klasse String nicht von dir geschrieben ist, kannst du sie auch nicht ändern. Und da String sealed ist, kannst du noch nicht mal eine Klasse von String ableiten, um dort einen Event zu definieren.

und da sich ein string NIE ändert, sondern stets ein neues string objekt erzeugt wird, würde ein Changed event auch keinen sinn machen.

loop:
btst #6,$bfe001
bne.s loop
rts