Erweiterungsmethode
Als Erweiterungsmethode (englisch extension method) wird unter .NET und dem .Net-Framework eine Methode bezeichnet, die eine Klasse oder Schnittstelle erweitert, ohne Teil der Implementierung der erweiterten Klasse zu sein.[1] Es wirkt dabei nur auf den ersten Blick wie Mehrfachvererbung. Es handelt sich dabei allerdings um syntaktischen Zucker, also einen Compilertrick, der die Erweiterungsmethode der Klasse zuordnet.[2]
Seit .NET 10 bzw. C# 14 können neben Methoden auch Eigenschaften und Operatoren nachträglich einem Datentyp hinzugefügt werden. Zudem können nun auch statische Methoden nachträglich einem Datentyp hinzugefügt werden.[3]
Anwendung
[Bearbeiten | Quelltext bearbeiten]Erweiterungsmethoden werden in C# in einer statischen Klasse und in Visual Basic in einem Module definiert. Seit C# 14 gibt es zwei Möglichkeiten, Erweiterungsmethoden zu definieren.[1]
Alte Syntax
[Bearbeiten | Quelltext bearbeiten]Alle Erweiterungsmethoden müssen als static deklariert werden. In C# definiert das Schlüsselwort this vor dem ersten Parameter den zu erweiternden Typen; in VB wird der erste Parameter übernommen, sofern die entsprechende Methode mit dem Extension-Attribut ausgezeichnet wurde.[4]
Der Parameter, der erweitert wird, wird beim Aufruf nicht mit übergeben.
Die veraltete Syntax ermöglicht ausschließlich das Hinzufügen von Methoden auf Objektebene. Statische Methoden können nicht auf diese Art und Weise einem Datentyp hinzugefügt werden.[1]
Neue Syntax
[Bearbeiten | Quelltext bearbeiten]Erweiterungen für einen Datentyp werden in einem extension-Block deklariert. Hier können diverse Erweiterungsmitglieder (Eigenschaften, Methoden und Operatoren) so implementiert werden, als ob sich diese direkt im zu erweiternden Datentyp befinden würden.
Bei Methoden entfällt der vorangestellte this-Parameter, da der betroffene Datentyp in den Beginn des extension-Blocks ausgelagert wird. Bei Methoden mit generischen Typen wird der Typparameter ebenfalls in den Beginn des extension-Blocks verschoben. Zudem entfällt die Auszeichnung static, sofern es sich wie zuvor gewohnt um eine Methode auf Instanzebene handeln soll.[1]
Beispiele (C#)
[Bearbeiten | Quelltext bearbeiten]Im ersten Beispiel soll die Klasse System.String um eine weitere Substring-Anweisung ergänzt werden.
Im zweiten Beispiel wird die Schnittstelle IEnumerable<T> mit IsNullOrEmpty() erweitert.
Das dritte Beispiel fügt dem Datentyp char die statische Methode GetRandomLetter() hinzu, die einen zufälligen Buchstaben (A–Z) zurückliefert. Das ist nur in der neuen Syntax möglich.
Alte Syntax
[Bearbeiten | Quelltext bearbeiten]public static class MyExtensions
{
public static string MySubstring(this string me, int position, int length)
{
//beliebige Logik
return "My" + me.Substring(position, length);
}
public static bool IsNullOrEmpty<T>(this IEnumerable<T> x)
=> (x == null || x.Count() < 1);
}
Neue Syntax
[Bearbeiten | Quelltext bearbeiten]public static class MyExtensions
{
extension(string me)
{
public string MySubstring(int position, int length)
{
//beliebige Logik
return "My" + me.Substring(position, length);
}
}
extension<T>(IEnumerable<T> x)
{
public bool IsNullOrEmpty()
=> (x == null || x.Count() < 1);
}
extension(char)
{
public static char GetRandomLetter()
=> (char) new Random().Next(65, 90);
}
}
Verwendung
[Bearbeiten | Quelltext bearbeiten]string teststring = "test";
teststring.MySubstring(1, 2);
IEnumerable<int> list = someObject.GetNumbers();
bool isNullOrEmpty = list.IsNullOrEmpty();
char buchstabe = char.GetRandomLetter();
Vorteile
[Bearbeiten | Quelltext bearbeiten]- Erweiterung beliebiger Klassen, auch Klassen, die als
sealed(C#) bzw.NotInheritable(VB) definiert sind, wieSystem.String - Hinzufügen einer konkret implementierten Methode an ein Interface und damit an alle darauf aufbauenden Klassen (z. B.
IList) - Es ist nicht mehr nötig ganze Klassen abzuleiten um eigene Features hinzuzufügen
Nachteile
[Bearbeiten | Quelltext bearbeiten]- Extensions werden durch eine
using- (C#) bzw.Imports- (VB) Direktive verfügbar. Hier können Namensraumkonflikte entstehen. - Durch intensive Verwendung von Erweiterungsmethoden kann der Code unübersichtlich werden
Literatur
[Bearbeiten | Quelltext bearbeiten]- Andreas Kühnel: Visual C# 2012 von Andreas Kühnel. 6. Auflage. Rheinwerk Verlag, Bonn 2012, ISBN 978-3-8362-1997-6, Kapitel 10.4: Erweiterungsmethoden, S. 389 ff. (Volltext).
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Extension members (C# Programming Guide). In: learn.microsoft.com. (englisch).
- Tutorial: Explore extension members in C# 14. In: learn.microsoft.com. (englisch).
- Extension Methods in C#: Adding Power Without Changing Code. In: syntacticsugardaddy.com. (englisch).
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ a b c d Extension members (C# Programming Guide). In: learn.microsoft.com. Microsoft, abgerufen am 21. März 2021 (englisch).
- ↑ Giannis Akritidis: 6 Ways To Use Extension Methods In C# Other Than Extending Existing Types. In: giannisakritidis.com. 20. März 2023, abgerufen am 18. November 2025 (englisch).
- ↑ Extension members. In: learn.microsoft.com. Microsoft, abgerufen am 18. November 2025 (englisch).
- ↑ Extension Methods (Visual Basic). In: learn.microsoft.com. Microsoft, abgerufen am 18. November 2025 (englisch).