Delegates sind in C# typsichere Funktionszeiger, also Werte, die eine Methode mit passender Signatur referenzieren und später über Aufruf der Delegate-Instanz ausführen. Technisch sind Delegates Klassen, die von System.MulticastDelegate abgeleitet sind und damit auch eine Aufruflist mehrerer Methoden (Multicast) verwalten können — eine Eigenschaft, auf der das klassische Event-Modell von .NET aufbaut.
Eingesetzt werden Delegates in vielen Schichten: explizit als Parameter-Typen für Strategy-Pattern, Callbacks und Hooks (z. B. in Sortier- und Such-Algorithmen), in Events von UI-Frameworks (Click, ValueChanged), in LINQ als Prädikate und Projektionen über die generischen Delegates Func, Action und Predicate, in async-Operationen als Continuations und in Plugin-Architekturen, in denen externer Code in eine Anwendung eingehängt wird.
Der Einsatzzweck und das gelöste Problem von Delegates liegen in der Trennung zwischen ‚wie etwas aufgerufen wird' und ‚was konkret aufgerufen wird'. Vor Delegates wurden ähnliche Mechanismen in C/C++ über rohe Funktionszeiger oder Funktionsobjekte realisiert — typunsicher, schwer zu serialisieren und ohne Multicast. Delegates sind typsicher (der Compiler prüft Signaturkompatibilität), thread-sicher in der Multicast-Verteilung und integrieren sich vollständig in das CLR-Sicherheitsmodell.
Historisch sind Delegates seit C# 1.0 (2002) in der Sprache verankert. Mit C# 2.0 (2005) kamen anonyme Methoden hinzu, mit C# 3.0 (2007) Lambda-Ausdrücke, die heute in der Praxis fast vollständig die explizite Erzeugung von Delegate-Instanzen ersetzen. Mit den generischen Delegates Func und Action (eingeführt im System-Namespace ab .NET 3.5) hat sich der Bedarf an benannten Delegate-Typen stark reduziert; sie werden heute vor allem dort definiert, wo Lesbarkeit und Domänenklarheit wichtig sind.
In einem oft zitierten Vortrag erklärte Hejlsberg, das Konzept der Delegates sei eine bewusste Reaktion auf die Schwäche von Java, anstelle echter Sprachunterstützung Inner-Classes für Callbacks zu nutzen — ein Ansatz, den Sun-Mitarbeiter zur damaligen Zeit massiv verteidigten. Heute gilt das C#-Delegate-Modell als eines der ausdrucksstärksten Funktionszeiger-Modelle in einer Mainstream-Sprache und bildet die technische Grundlage für nahezu jedes ereignis- und Callback-basierte API in .NET.