Delegaten sind in C# aufgebaut wie normale Methoden, jedoch besitzen sie keinen Code der ausgeführt wird, sondern weisen lediglich auf eine Methode mit Code hin.
Das bedeutet, dass die Delegaten genau so wie Methoden
einen Zugriffsmodifikator (private, public ), einen Rückgabe wert und Parameter haben. Die Parameter müssen aber in der Anzahl und Datentyp den Methoden identisch sein.
1 2 3 4 5 6 7 8 9 10 11 |
delegate int aufruf(int a, int b); static void Main(string[] args) { aufruf auf = new aufruf(addierer); Console.WriteLine(auf(5, 9)); Console.ReadLine(); } static int addierer(int x, int y) { return (x + y); } |
Interessant werden Delegaten in Verbindung mit Events auf Deutsch Ereignisse. Events werden ausgelöst. Wenn man einen Button klickt, löst man das Click-Event aus. In WPF und Windows Forms haben die Steuerelemente z.B. viele vordefinierte Events. So kann man ein Mouseover Event auslösen lassen, wenn man z.B. mit der Maus über ein Steuerelement fährt. Sobald nun ein Event ausgelöst wird, versucht das an Ihm hängende Delegat eine Methode auszulösen mit den Rückgabewerten und Parameter, die dem Delegat zur Verfügung stehen. Das Interessante ist, dass ein Delegat unabhängig vom Zugriffsmodifikator arbeitet. An beide wird eine Methode durch überladung angehängt “ += “ oder abgezogen “ -= „.
Mal ein kleines Beispiel, wie wir mithilfe eines Delegaten und Event von einem neuen Window in das Mainwindow Label etwas schreiben können:
MainWindow:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void cmdButton_Click(object sender, RoutedEventArgs e) { Window1 w1 = new Window1(); w1.MyEvent += wnd_MyCustomEvent; w1.Show(); } void wnd_MyCustomEvent(int value) { lblLabel.Content = value; } } |
Das neue Window1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Window1 : Window { public delegate void MyDelegate(int value); public event MyDelegate MyEvent; public Window1() { InitializeComponent(); } private void cmd_w1_Button_Click(object sender, RoutedEventArgs e) { MyEvent(100); } } |
Hier sehen wir, dass zunächst im MainWindow dem Event vom Objekt w1 die Methode wnd_MyCustomEvent hinzugetan wurde. Jedesmal also, wenn das Event ausgeführt wird, wird auch diese Methode ausgeführt.
Im Window1 wird nun die Methode durch das klicken auf den cmd_w1_Button das Event MyEvent ausgelöst und dem dazugehörigen Delegaten wird der Parameter von 100 übergeben.
Abschließend wird nun im MainWindow dieser Wert angezeigt
Der nächste Schritt, den man gehen könnte ist, noch ein neues Window zu erstellen und dort eine Methode hinzufügen:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public partial class Window2 : Window { public Window2() { InitializeComponent(); } public void mb(int a) { MessageBox.Show(a.ToString()); } } |
Dem MainWindow fügen wir hinzu:
1 2 |
Window2 w2 = new Window2(); w1.MyEvent += w2.mb; |
Ausgabe ist eine Messagebox mit dem Wert 100 aus der Klasse in Window2 heraus
Login