Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C# Delegat, kann mir das wer erklären?
- Ersteller __thali__
- Erstellt am
D
dbeuebeb
Gast
- Registriert
- Dez. 2018
- Beiträge
- 356
dbeuebeb schrieb:
HAb ich mir ja schon videos angschaut..aber irgendwie verstehe ichd as nicht so ganz
- Registriert
- Dez. 2018
- Beiträge
- 356
haben am Mittwoch schularbeit über serielle Comunication...also mit AArduino irgenwie ne LED dimmen und eine ein/aus schalten und z.b EInen taster abrufeen ob er gedrückt ist oder nicht....also wenn er gedrückt wird soll der delegate das einlesen und dann z.b mit nem Timer ein Kästchen rot oder grün färben auf dem PCmichi.o schrieb:Du must schon etwas spezifischer werden. Was verstehst Du nicht?
Delegates sind im Prinzip Referenzen auf Methoden. Die können wie eine Variable weitergegeben und woanders aufgerufen werden. Was willst Du mit Delegates machen?
das war jetzt vor kurzem ein übungsbeispiel
- Registriert
- Dez. 2018
- Beiträge
- 356
c# aktuell mit Windows formsmichi.o schrieb:Sicher das das C# ist?
Arduino macht man eigentlich mit C oder C++. Den Begriff Delegate gibts dort auch, nur wird der eher selten benutzt.
Ich kann jetzt nicht zu viel schreiben weil wir hier im Forum keine Hausaufgaben lösen sollen.
Im Fall von einem Timer unter Windows Forms ziehst Du den Timer über die Toolbar auf die Oberfläche. Der Timer erscheint dann im Designer unten am Bildschirmrand. Wenn Du einen Doppelklick drauf machst, wird automatisch eine Methode im Code angelegt und an das Tick Ereignis vom Timer angemeldet. Das ist im Prinzip der Delegate.
Den Code zum Auslesen und Oberfläche ändern einfach dort rein.
Im Fall von einem Timer unter Windows Forms ziehst Du den Timer über die Toolbar auf die Oberfläche. Der Timer erscheint dann im Designer unten am Bildschirmrand. Wenn Du einen Doppelklick drauf machst, wird automatisch eine Methode im Code angelegt und an das Tick Ereignis vom Timer angemeldet. Das ist im Prinzip der Delegate.
C#:
private void timer1_Tick(object sender, EventArgs e)
{
// Code hier rein
}
Den Code zum Auslesen und Oberfläche ändern einfach dort rein.
- Registriert
- Dez. 2018
- Beiträge
- 356
michi.o schrieb:Ich kann jetzt nicht zu viel schreiben weil wir hier im Forum keine Hausaufgaben lösen sollen.
Im Fall von einem Timer unter Windows Forms ziehst Du den Timer über die Toolbar auf die Oberfläche. Der Timer erscheint dann im Designer unten am Bildschirmrand. Wenn Du einen Doppelklick drauf machst, wird automatisch eine Methode im Code angelegt und an das Tick Ereignis vom Timer angemeldet. Das ist im Prinzip der Delegate.
C#:private void timer1_Tick(object sender, EventArgs e) { // Code hier rein }
Den Code zum Auslesen und Oberfläche ändern einfach dort rein.
ICh bin nicht HOHL im kopf...ich kann mit timern umgehen und die ZEilen vom Delegat auswendig merken...aber ich habe gehofft hier gibts einen der mir das nochmalm bischen erklären aknn wo was hinkommt und wieso
Hab ich ja nicht behauptet. Kann nicht wissen, wie viel Vorwissen du hast.__thali__ schrieb:ICh bin nicht HOHL
Auf die schnelle hab ich mal folgendes Beispiel:
Code:
using System;
namespace ConsoleApp1
{
class Program
{
delegate double Rechne(double a, double b);
static void Main(string[] args)
{
double x = 4;
double y = 3;
Rechne rechne = Addiere;
Console.WriteLine(rechne(x, y));
x = 4;
y = 3;
rechne = Multipliziere;
Console.WriteLine(rechne(x, y));
x = 4;
y = 3;
rechne = (Rechne)Addiere + (Rechne)Multipliziere;
Console.WriteLine(rechne(x, y));
Console.ReadKey(); // Hält Programm an
}
static double Addiere(double a, double b)
{
return a + b;
}
static double Multipliziere(double a, double b)
{
return a * b;
}
}
}
Die Ausgabe von dem Programm ist:
7
12
12
Die Delegate Deinition in Zeile 7 gibt vor, wie die Methode auszusehen hat. Ich kann dann eine Variable von diesem Typ definieren und ihr eine Methode zuweisen, die genau dem Delegate entspricht (z.B. Zeile 14).
Wenn die Delegate Variable wie eine Methode aufgerufen wird, dann ist das so, als ob man die Methode aufruft.
Zusätzlich kann man Delegates addieren. In Zeile 26 hab ich das gemacht. Beim Aufruf der Variable werden dann beide Methoden nacheinander aufgerufen. Genau dieser Mechanismus wird für Events benutzt.
Das ist eigentlich alles. Mehr können Delegates nicht.
Gibt noch anonyme Delegates, die man mit Lambda ganz kurz Schreiben kann:
C#:
rechne = (double a, double b) => a - b;
Update: Das letzte beispiel mit dem Addieren von mir ist doof, da werden die Werte nicht in die nächste Rechnung übernommen. Rückgabewert ist von der letzten ausgeführten Methode.
Zuletzt bearbeitet:
- Registriert
- Dez. 2018
- Beiträge
- 356
michi.o schrieb:Hab ich ja nicht behauptet. Kann nicht wissen, wie viel Vorwissen du hast.
Auf die schnelle hab ich mal folgendes Beispiel:
Code:using System; namespace ConsoleApp1 { class Program { delegate double Rechne(ref double a, ref double b); static void Main(string[] args) { double x = 4; double y = 3; Rechne rechne = Addiere; Console.WriteLine(rechne(ref x, ref y)); x = 4; y = 3; rechne = Multipliziere; Console.WriteLine(rechne(ref x, ref y)); x = 4; y = 3; rechne = (Rechne)Addiere + (Rechne)Multipliziere; Console.WriteLine(rechne(ref x, ref y)); Console.ReadKey(); // Hält Programm an } static double Addiere(ref double a, ref double b) { return a + b; } static double Multipliziere(ref double a, ref double b) { return a * b; } } }
Die Ausgabe von dem Programm ist:
7
12
12
Die Delegate Deinition in Zeile 7 gibt vor, wie die Methode auszusehen hat. Ich kann dann eine Variable von diesem Typ definieren und ihr eine Methode zuweisen, die genau dem Delegate entspricht (z.B. Zeile 14).
Wenn die Delegate Variable wie eine Methode aufgerufen wird, dann ist das so, als ob man die Methode aufruft.
Zusätzlich kann man Delegates addieren. In Zeile 26 hab ich das gemacht. Beim Aufruf der Variable werden dann beide Methoden nacheinander aufgerufen. Genau dieser Mechanismus wird für Events benutzt.
Das ist eigentlich alles. Mehr können Delegates nicht.
Gibt noch anonyme Delegates, die man mit Lambda ganz kurz Schreiben kann:
C#:rechne = (ref double a, ref double b) => a - b;
MEGA NETT von dir...DAnke
aber bei Windows Forms da braucht man ja viel mehr, BZW um daten Einzulesen, ich brauche dafür leut lehrer das alles:
{
InitializeComponent();
{
uebergabeMethode = new AddDataDelegate(Anzeigen);
}
delegate void AddDataDelegate(byte wert1); // übergabe Parameteer
AddDataDelegate uebergabeMethode;
}
private void serialPort1_DataReceived_1(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
while (serialPort1.BytesToRead > 0)
{
byte wert = (byte)serialPort1.ReadByte();
this.Invoke(this.uebergabeMethode, new Object[] { Convert.ToByte(wert) });
void Anzeigen(byte wert1)
{
}
Alles was FETT geschrieben ist sind dei Zeilen für den DELEGATE...Das serialport1.DataREceived ist nur um dann wenn daten kommen das einzulesen....könntest du mir hier erklären wo was übergeben wird?
Ergänzung ()
__thali__ schrieb:MEGA NETT von dir...DAnke
aber bei Windows Forms da braucht man ja viel mehr, BZW um daten Einzulesen, ich brauche dafür leut lehrer das alles:
{
InitializeComponent();
{
uebergabeMethode = new AddDataDelegate(Anzeigen);
}
delegate void AddDataDelegate(byte wert1); // übergabe Parameteer
AddDataDelegate uebergabeMethode;
}
private void serialPort1_DataReceived_1(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
while (serialPort1.BytesToRead > 0)
{
byte wert = (byte)serialPort1.ReadByte();
this.Invoke(this.uebergabeMethode, new Object[] { Convert.ToByte(wert) });
void Anzeigen(byte wert1)
{
}
Alles was FETT geschrieben ist sind dei Zeilen für den DELEGATE...Das serialport1.DataREceived ist nur um dann wenn daten kommen das einzulesen....könntest du mir hier erklären wo was übergeben wird?
Da verstehe ich eben das nicht warum da wert und einmal wert1 übergeben wird? ist das FAlsch?
Pls erklär einfach kurz wo was übergeben wird..gerne auch TS3 oder discord
Da ich das in meinem Beispiel nicht erwähnt hatte: Das "new Delegate(...)" kann man weg lassen und direkt ... schreiben. Folgende Zeilen sind also gleich:
uebergabeMethode zeigt dann im Anschluss auf "Anzeigen(byte wert1)".
Die folgenden Zeilen sollte klar sein:
Hier wirds interessant:
Das ist exakt dasselbe wie:
Code:
uebergabeMethode = new AddDataDelegate(Anzeigen);
uebergabeMethode = Anzeigen;
Die folgenden Zeilen sollte klar sein:
Code:
delegate void AddDataDelegate(byte wert1)
Code:
AddDataDelegate uebergabeMethode;
Hier wirds interessant:
Code:
this.Invoke(this.uebergabeMethode, new Object[] { Convert.ToByte(wert) });
Code:
Anzeigen(Convert.ToByte(wert));
- Registriert
- Dez. 2018
- Beiträge
- 356
michi.o schrieb:Da ich das in meinem Beispiel nicht erwähnt hatte: Das "new Delegate(...)" kann man weg lassen und direkt ... schreiben. Folgende Zeilen sind also gleich:
uebergabeMethode zeigt dann im Anschluss auf "Anzeigen(byte wert1)".Code:uebergabeMethode = new AddDataDelegate(Anzeigen); uebergabeMethode = Anzeigen;
Die folgenden Zeilen sollte klar sein:
Code:delegate void AddDataDelegate(byte wert1)Code:AddDataDelegate uebergabeMethode;
Hier wirds interessant:
Das ist exakt dasselbe wie:Code:this.Invoke(this.uebergabeMethode, new Object[] { Convert.ToByte(wert) });
Code:Anzeigen(Convert.ToByte(wert));
Also wird wert quasi eingelesen und dann hochespeichert in den Delegate?
und dann in Anzeigen wird dieser WErt dann angezeigt heiß zwar wert1 ist aber der selbe?
__thali__ schrieb:WErt dann angezeigt heiß zwar wert1 ist aber der selbe
Das wert1 in "void Anzeigen(byte wert1)" ist nur ein lokaler Name für den übergebenen Wert. In Deinem Beispiel ist wert und wert1 dasselbe. Bzw. beim Aufruf hat wert1 den Wert von wert (eigentlich dem Ergebnis von
"Convert.ToByte(wert)").
- Registriert
- Dez. 2018
- Beiträge
- 356
michi.o schrieb:Das wert1 in "void Anzeigen(byte wert1)" ist nur ein lokaler Name für den übergebenen Wert. In Deinem Beispiel ist wert und wert1 dasselbe.
ah danke
wird da der delegate erstellt und mit der übergabemethode verknüpft oder?=
Das "delegate void" ist nur die Definition, die angibt, wie die Methode aufgebaut sein muss (Typdefinition).
"AddDataDelegate uebergabeMethode;" ist die Definition von der Variablen.
Die Verknüpfung passiert hier: "uebergabeMethode = new AddDataDelegate(Anzeigen);"
"AddDataDelegate uebergabeMethode;" ist die Definition von der Variablen.
Die Verknüpfung passiert hier: "uebergabeMethode = new AddDataDelegate(Anzeigen);"
- Registriert
- Dez. 2018
- Beiträge
- 356
michi.o schrieb:"AddDataDelegate uebergabeMethode;" ist die Definition von der Variablen.
Hier wird also bestimmt was übergeben wird? in diesem FAll byte? da byte ja in der uebergabeMethode sind oder?
- Registriert
- Dez. 2018
- Beiträge
- 356
OKAY...danke du hast es mir jetzt alles erklärt...habs ziehmlich gecheckt.. vielen dankmichi.o schrieb:Da wir gesagt, dass "uebergabeMethode" eine Variable vom Typ "AddDataDelegate" ist. Und "AddDataDelegate" gibt vor, dass man ein byte übergeben muss. Kurzgesagt, ja.
Ähnliche Themen
- Antworten
- 30
- Aufrufe
- 1.800
S
- Antworten
- 7
- Aufrufe
- 721
S
- Antworten
- 11
- Aufrufe
- 2.962