Das Erscheinen von Erweiterungsmethoden ist mit der Notwendigkeit verbunden, neuen Funktionen zu bestehenden Datentypen (insbesondere Bibliotheks- und externen Typen) hinzuzufügen, ohne den Quellcode dieser Typen zu ändern. Dies ist besonders relevant in modernen .NET-Anwendungen, wo zusätzliche Bequemlichkeiten benötigt werden, aber kein Zugang zur Modifikation der Quellklassen besteht.
Das Problem bestand darin, dass es nicht möglich war, Typen zu erweitern, ohne Nachkommen oder Wrapper zu erstellen, was zu einer komplizierten Architektur und „falscher“ Vererbung führte.
Die Lösung sind Erweiterungsmethoden. In Visual Basic werden sie als Module mit statischen Methoden deklariert, die mit dem Attribut <Extension> versehen sind. Der erste Parameter der Methode verweist immer auf den erweiterbaren Typ, was es ermöglicht, auf die Methode wie auf ein normales Mitglied des Objekts zuzugreifen.
Beispielcode:
Imports System.Runtime.CompilerServices Module StringExtensions <Extension> Public Function ToTitleCase(ByVal str As String) As String If String.IsNullOrEmpty(str) Then Return str Return Char.ToUpper(str(0)) & str.Substring(1).ToLower() End Function End Module ' Verwendung: Dim s As String = "visual basic" Console.WriteLine(s.ToTitleCase()) ' Visual basic
Wesentliche Merkmale:
Kann man auf eine Erweiterungsmethode über den Klassennamen und nicht über eine Instanz zugreifen?
Ja, die Erweiterungsmethode kann auch über den Namen der Erweiterungsklasse als statische Methode aufgerufen werden, indem der erste (this/Me) Parameter explizit angegeben wird.
Beispielcode:
StringExtensions.ToTitleCase("test string")
Kann man das Verhalten systemeigener Methoden durch Erweiterungsmethoden überschreiben (Override)?
Nein, Erweiterungsmethoden überschreiben keine bestehenden Instanzmethoden. Bei Namensübereinstimmungen wird die native Methode des Typs aufgerufen.
Können Erweiterungsmethoden eine variable Anzahl von Argumenten (ParamArray) haben, zum Beispiel für Strings?
Ja, man kann ParamArray in Erweiterungsmethoden verwenden, wie auch in normalen statischen Methoden.
In einem großen Projekt werden für jeden Typ eigene Erweiterungsmethoden mit sich überschneidenden Namen und unterschiedlicher Logik ohne einheitlichen Stil erstellt.
Vorteile:
Nachteile:
Im Modul werden nur universelle und gut dokumentierte Erweiterungen für Standardoperationen über Typen gesammelt. Der Name jeder Methode macht ihren Zweck klar.
Vorteile:
Nachteile: