Entwickler-Ecke

C# - Die Sprache - Wozu delegates?


CASS - Di 10.10.06 23:52
Titel: Wozu delegates?
Hallo Community,

wie wohl schon an der Art der Frage zu erkennen ist, bin ich nicht gerade der Profiprogrammierer...

Ich wollte mal fragen wozu Delegates eigentlich gut sind??? Wann sollte man sie nehmen bzw. wann muss man sie nehmen?

Danke für eure Hilfe!
Cass


Christian S. - Di 10.10.06 23:55

Hallo!

Einer der großen Einsatzbereiche von Delegates sind wohl die Events. Denn Events sind ja ansich nur eine Menge von Delegates, die nach und nach aufgerufen werden.

Auch nützlich sind Delegates z.B. bei Callback-Funktionen, wenn eine Methode also (als Beispiel) eine lange Berechnung durchführt und in jedem Schritt eine Methode zur Statusmeldung aufruft. Mit einem Delegate übergibt man diese Statusmethode als Parameter und ist flexibel.

Sorry, für die kürze der Antwort, aber ist schon spät ;-)

Grüße
Christian


Kha - Mi 11.10.06 16:59

user profile iconChristian S. hat folgendes geschrieben:
Denn Events sind ja ansich nur eine Menge von Delegates, die nach und nach aufgerufen werden.
Events sind einfach nur Delegate-Properties ;) . Sie bestehen lediglich aus einer add- und einer remove-Methode, ggf. (= 95% der Fälle ;) ) noch aus einem autogenerierten Delegate-Feld, Delegates selbst bieten also schon das Multicast-Feature:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
delegate void DoDelegate();

static void Main(string[] args)
{
  DoDelegate d = DoSomething;
  // entspricht DoDelegate d = new DoDelegate(DoSomething);

  d += DoAnotherThing;
  // wird kompiliert zu d = (DoDelegate)Delegate.Combine(d, new DoDelegate(DoAnotherThing))

  d();
  // => d.Invoke();
}


Ein schönes weiteres Beispiel für Callback-Methoden ist List<T>.Sort(Comparison<T> comparison). Als Argument wird ein Delegate übergeben, der innerhalb der Funktion aufgerufen wird, um die Reihenfolge zweier Elemente zu bestimmen.

PS: Ein Delegate/Event-Aufruf lässt sich grundsätzlich immer durch einen Interface-Aufruf ersetzen (s. z.B. List<T>.Sort(IComparer<T> comparer)), was aber häufig um Einiges umständlicher ist. Genau dann ist es sinnvoll, Delegates/Events zu benutzen.