Erweiterungsmethode
Als Erweiterungsmethode ({{Modul:Vorlage:lang}} Modul:Vorlage:lang:103: attempt to index field 'wikibase' (a nil value)) 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.<ref name="ExtensionMembers_Guide">Extension members (C# Programming Guide). In: learn.microsoft.com. Microsoft, abgerufen am 21. März 2021 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> 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.<ref>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 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
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.<ref name="ExtensionMembers_Spec">Extension members. In: learn.microsoft.com. Microsoft, abgerufen am 18. November 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
Anwendung[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.<ref name="ExtensionMembers_Guide" />
Alte Syntax[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.<ref>Extension Methods (Visual Basic). In: learn.microsoft.com. Microsoft, abgerufen am 18. November 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>
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.<ref name="ExtensionMembers_Guide" />
Neue Syntax[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.<ref name="ExtensionMembers_Guide" />
Beispiele (C#)[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]
<syntaxhighlight lang="csharp"> 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);
} </syntaxhighlight>
Neue Syntax[Bearbeiten]
<syntaxhighlight lang="csharp"> 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);
}
} </syntaxhighlight>
Verwendung[Bearbeiten]
<syntaxhighlight lang="csharp"> string teststring = "test"; teststring.MySubstring(1, 2);
IEnumerable<int> list = someObject.GetNumbers(); bool isNullOrEmpty = list.IsNullOrEmpty();
char buchstabe = char.GetRandomLetter(); </syntaxhighlight>
Vorteile[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]
- 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]
- 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]
- Extension members (C# Programming Guide). In: learn.microsoft.com. (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).
- Tutorial: Explore extension members in C# 14. In: learn.microsoft.com. (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).
- Extension Methods in C#: Adding Power Without Changing Code. In: syntacticsugardaddy.com. (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).
Einzelnachweise[Bearbeiten]
<references />