Erweiterungsmethode
From Wikipedia, the free encyclopedia
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
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
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
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#)
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
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
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
string teststring = "test";
teststring.MySubstring(1, 2);
IEnumerable<int> list = someObject.GetNumbers();
bool isNullOrEmpty = list.IsNullOrEmpty();
char buchstabe = char.GetRandomLetter();
Vorteile
- 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
- 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
- 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
- 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).