DieMstar Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 (bearbeitet) Ich lese im Rahmen von VB.NET immer wieder von Delegaten. Egal wie oft ich mir deren beschreibung durchlese oder mir Codebeispiele ansehe, ich versteh einfach nicht wofür die gut sein sollen ? Kann mir das jemand erklären? Bearbeitet 21. März 2019 von DieMstar Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
1 DieMstar Geschrieben 21. März 2019 Autor Teilen Geschrieben 21. März 2019 vor 3 Minuten schrieb KeeperOfCoffee: Ich finde am besten kann sowas immer noch die offizielle Doc erklären. In dem Fall für VB.NET welches du ja verwendest: https://docs.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/delegates/ Das ist leider genau das was ich gelesen und nicht verstanden habe ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
1 Whiz-zarD Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 In strukturierten Programmiersprachen (z.B. C) nennt man sowas auch Funktionszeiger. Ein Delegate ist ein sog. Funktionstyp. Es gibt drei Arten von Typen. Wertetypen, wie z.B. Int, decimal, float beinhalten einen Wert. Ich schreibt hier C#-Code, da ich mit der Visual Basic-Syntax nicht ganz so vertraut bin: int wert = 23; Referenztypen besitzen eine Referenz zu einem Objekt: // Definition einer Klasse public class ClassA { // Code } // Erzeugung einer Instanz einer Klasse ClassA klasseA = new ClassA(); Die Variabel klasseA besitzt als Wert nun die Speicheradresse, wo das Objekt im Speicher gespeichert wurde. Darum kannst du auch nicht zwei Objekte mit dem Vergleichsoperator auf Gleichheit überprüfen. Also: ClassA klasseA1 = new ClassA(); ClassA klasseA2 = new ClassA(); Console.WriteLine(klasseA1 == klasseA2); // Es wird false zurückgewiesen, weil die Speicheradressen unterschiedlich sind Funktionstypen also die Delegates besitzen eine Referenz zu einer Methode. Beispiel: public class ClassA { // Defintion eines Delegates public delegate int Berechnung(int x, int y); // Funktionstyp als private Klassenvariable private Berechnung berechnung; // Über den Kontruktor wird das Delegate mitgegeben public ClassA(Berechnung berechnung) { this.berechnung = berechnung; } // Ausgabe des Ergebnisses des Delegates public void Ausgabe(int x, int y) { Console.WriteLine(this.berechnung(x, y)); } } Nun kann man bei der Erzeugung der Instanz von KlasseA ein Delegate mitliefern, der beschreibt, was die Berechnung tun soll: ClassA classA = new ClassA(Summiere); classA.Ausgabe(10, 10); private int Summiere(int x, int y) { return x + y; } Da das Delegate und die Methode Summiere() die selbe Methodensignatur (die selben Parameter) aufweisen, kann ich jetzt nun die Summiere()-Methode als Delegate mitliefern. Es ist also eine Referenz auf die Methode. Wenn man jetzt nun die Ausgabe()-Methode von klasseA ausführt, wird das Delegate ausgeführt und das Delegate zeigt auf die Summiere()-Methode und dann werden beide Zahlen addiert. Auf diese Weise kann man nun das Verhalten einer Klasse bestimmen. Ein anderes Beispiel wären die Events bei grafischen Oberflächen. Wenn du z.B. auf ein Button klickst, wird ja das OnClick()-Event aufgerufen und du kannst über das Event programmieren, was bei einem Mausklick passieren soll. Events sind auch Delegates. bummel und KeeperOfCoffee reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 KeeperOfCoffee Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 Um es extrem simpel zu sagen: Delegaten sind ähnlich die Funktionszeiger (wie die Docs ja schon sagen). Sie können auf Methoden eines Objects, statischen Methoden oder anonymen Methoden verweisen. Du kannst auch dem Delegate ganze Objekte übergeben. Mir persönlich hat https://buildplease.com/pages/why-delegates/ gut geholfen zu verstehen, wie sie in der Praxis eingesetzt werden können. Du kannst halt in nem Delegate mehrere Sachen "abwickeln" und sparst dir so manchen Code immer wieder zu schreiben. Siehst du schön in den letzten zwei Codebeispielen auf der Seite. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 DieMstar Geschrieben 21. März 2019 Autor Teilen Geschrieben 21. März 2019 vor 48 Minuten schrieb Whiz-zarD: In strukturierten Programmiersprachen (z.B. C) nennt man sowas auch Funktionszeiger. Ein Delegate ist ein sog. Funktionstyp. Es gibt drei Arten von Typen. Wertetypen, wie z.B. Int, decimal, float beinhalten einen Wert. Ich schreibt hier C#-Code, da ich mit der Visual Basic-Syntax nicht ganz so vertraut bin: int wert = 23; Referenztypen besitzen eine Referenz zu einem Objekt: // Definition einer Klasse public class ClassA { // Code } // Erzeugung einer Instanz einer Klasse ClassA klasseA = new ClassA(); Die Variabel klasseA besitzt als Wert nun die Speicheradresse, wo das Objekt im Speicher gespeichert wurde. Darum kannst du auch nicht zwei Objekte mit dem Vergleichsoperator auf Gleichheit überprüfen. Also: ClassA klasseA1 = new ClassA(); ClassA klasseA2 = new ClassA(); Console.WriteLine(klasseA1 == klasseA2); // Es wird false zurückgewiesen, weil die Speicheradressen unterschiedlich sind Funktionstypen also die Delegates besitzen eine Referenz zu einer Methode. Beispiel: public class ClassA { // Defintion eines Delegates public delegate int Berechnung(int x, int y); // Funktionstyp als private Klassenvariable private Berechnung berechnung; // Über den Kontruktor wird das Delegate mitgegeben public ClassA(Berechnung berechnung) { this.berechnung = berechnung; } // Ausgabe des Ergebnisses des Delegates public void Ausgabe(int x, int y) { Console.WriteLine(this.berechnung(x, y)); } } Nun kann man bei der Erzeugung der Instanz von KlasseA ein Delegate mitliefern, der beschreibt, was die Berechnung tun soll: ClassA classA = new ClassA(Summiere); classA.Ausgabe(10, 10); private int Summiere(int x, int y) { return x + y; } Da das Delegate und die Methode Summiere() die selbe Methodensignatur (die selben Parameter) aufweisen, kann ich jetzt nun die Summiere()-Methode als Delegate mitliefern. Es ist also eine Referenz auf die Methode. Wenn man jetzt nun die Ausgabe()-Methode von klasseA ausführt, wird das Delegate ausgeführt und das Delegate zeigt auf die Summiere()-Methode und dann werden beide Zahlen addiert. Auf diese Weise kann man nun das Verhalten einer Klasse bestimmen. Ein anderes Beispiel wären die Events bei grafischen Oberflächen. Wenn du z.B. auf ein Button klickst, wird ja das OnClick()-Event aufgerufen und du kannst über das Event programmieren, was bei einem Mausklick passieren soll. Events sind auch Delegates. Das ist ein wirklich tolles und lieb gemeintes Beispiel von dir! Und es ist wirklich schade das du dir soviel Mühe dafür gegeben hast und ich es leider immer noch nicht verstehe. Ich sehe keinen Grund Delegate zu benutzen. Ich erkenne irgendwie keinen Vorteil. Ich kann doch eine methode auch normal aufrufen ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Minerva/8 Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 vor 20 Minuten schrieb DieMstar: Ich sehe keinen Grund Delegate zu benutzen. Ich erkenne irgendwie keinen Vorteil. Ich kann doch eine methode auch normal aufrufen Ich denke der Nutzen dahinter ist die Tatsache das du Funktionen/Methoden mithilfe von Delegates als Argument übergeben kannst. Falls dir Callbacks ein Begriff sind könnte das ein gutes Beispiel für einen Anwendungsfall sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 vor einer Stunde schrieb DieMstar: Ich kann doch eine methode auch normal aufrufen ? Was ist aber, wenn du nicht weißt, was aufgerufen werden soll? Das Problem hast du ja bei den Events, wenn du eine grafische Oberfläche entwickelst. Für jedes Element einer grafischen Oberfläche gibt es ja zig Events. Beispiel wäre ein ja Klick auf ein Button. Woher soll der Button jetzt nun wissen, was passieren soll? Das programmierst du nun mit Hilfe eines Delegates und weist dem Delegate eine Methode zu. button1.Click += Button1_Click; // ... private void Button1_Click(object sender, EventArgs e) { // Code } Nun weiß der Button, dass er die Methode Button1_Click() aufrufen soll, wenn das Click-Event ausgelöst wurde. Ohne den Delegates müsstest du eine Ableitung vom Button schreiben und dort Methoden überschreiben. Das würde dazu führen, dass du für jedes Element auf der Oberfläche eine Ableitung benötigst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 KeeperOfCoffee Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 vor 7 Minuten schrieb Whiz-zarD: button1.Click += Button1_Click; Und das ist eben das Problem am Designer, da sieht man das ganze Zeug einfach nicht. @DieMstar schau dir mal die Designer Datei an, da wirst du sehen, dass du deiner Oberfläche auf diese Art und Weise oft ein Event hinzufügst....nur...der Designer macht dies halt für dich schon. DieMstar reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 DieMstar Geschrieben 21. März 2019 Autor Teilen Geschrieben 21. März 2019 (bearbeitet) vor 19 Minuten schrieb Whiz-zarD: Was ist aber, wenn du nicht weißt, was aufgerufen werden soll? Das Problem hast du ja bei den Events, wenn du eine grafische Oberfläche entwickelst. Für jedes Element einer grafischen Oberfläche gibt es ja zig Events. Beispiel wäre ein ja Klick auf ein Button. Woher soll der Button jetzt nun wissen, was passieren soll? Das programmierst du nun mit Hilfe eines Delegates und weist dem Delegate eine Methode zu. button1.Click += Button1_Click; // ... private void Button1_Click(object sender, EventArgs e) { // Code } Nun weiß der Button, dass er die Methode Button1_Click() aufrufen soll, wenn das Click-Event ausgelöst wurde. Ohne den Delegates müsstest du eine Ableitung vom Button schreiben und dort Methoden überschreiben. Das würde dazu führen, dass du für jedes Element auf der Oberfläche eine Ableitung benötigst. Verstehe ich Richtig, das bei einem Button mit namen "Login" die dazugehörige Login_Click Methode der Delegate ist? bzw der Delegate auf Login_Click zu der ClickListenerKlasse verweist, oder irgendwie so ? private void Login_Click(object sender, EventArgs e) { // Code } Bearbeitet 21. März 2019 von DieMstar Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 Ja, wenn du diese Methode dem Klick-Event zugewiesen hast. DieMstar reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 KeeperOfCoffee Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 (bearbeitet) Ok vergiss was ich gesagt habe, ich war mir 100%zig sicher, dass man die Zuordnung von Click dann in der .Designer.vb sieht, aber da ist nix....hab ich wohl falsch in Erinnerung. Jedenfalls finde ichs gerade nicht in meinem Test. Nvm in c# finde ichs this.button1.Location = new System.Drawing.Point(559, 213); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); aber nicht in VB...bin VB-blind Bearbeitet 21. März 2019 von KeeperOfCoffee DieMstar reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 vor 5 Minuten schrieb KeeperOfCoffee: Ok vergiss was ich gesagt habe, ich war mir 100%zig sicher, dass man die Zuordnung von Click dann in der .Designer.vb sieht, aber da ist nix....hab ich wohl falsch in Erinnerung. Jedenfalls finde ichs gerade nicht in meinem Test. Ich kenne mich mit Visual Basic auch nicht aus, da ich mit C# arbeite. (Keine Ahnung, wie man heutzutage eh auf die Idee kommt, mit Visual Basic zu arbeiten) aber offenbar handhabt Visual Basic die Events ein bisschen anders. Es steht wohl direkt in der Methoden-Signatur. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click End Sub Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Gast Guest Geschrieben 23. August 2019 Teilen Geschrieben 23. August 2019 Ich habe etwas, für mich sehr hilfreiches, gefunden. http://www.sws.bfh.ch/~amrhein/Skripten/Info2/02.Delegates.pdf. Eine Präsentation über Delegaten. Ich verstehe es zwar immer noch nicht, aber ich bin einen guten Schritt weiter gekommen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
-1 KeeperOfCoffee Geschrieben 21. März 2019 Teilen Geschrieben 21. März 2019 Ich finde am besten kann sowas immer noch die offizielle Doc erklären. In dem Fall für VB.NET welches du ja verwendest: https://docs.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/delegates/ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Frage
DieMstar
Ich lese im Rahmen von VB.NET immer wieder von Delegaten. Egal wie oft ich mir deren beschreibung durchlese oder mir Codebeispiele ansehe,
ich versteh einfach nicht wofür die gut sein sollen ?
Kann mir das jemand erklären?
Bearbeitet von DieMstarLink zu diesem Kommentar
Auf anderen Seiten teilen
13 Antworten auf diese Frage
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.