Code schnell ergänzen: die Erweiterungsmethoden von C# helfen

(http://www.zdnet.de/magazin/41523816/code-schnell-ergaenzen-die-erweiterungsmethoden-von-c-helfen.htm)

von Justin James, 2. Dezember 2009

Mit Erweiterungsmethoden lassen sich begrenzte Funktionalitäten unkompliziert zum Code hinzufügen. Außerdem umgeht man damit die Probleme, die eine Unterklassifizierung mit sich bringt. ZDNet zeigt, wie man die Methoden in einer statischen Klasse platziert.

Als man sich das erste Mal wirklich mit der objektorientierten Programmierung befasste, war es eines der ersten Ziele, die String-Klasse unterzuklassifizieren und diejenigen Leistungsmerkmale hinzuzufügen, die fehlten. Es wurde schnell klar, dass das Unterklassifizieren von Standardklassen, um zusätzliche Funktionalitäten hinzuzufügen, sich in vielen Fällen nicht lohnt. Das Objekt muss nämlich jedes Mal erneut gecastet werden, wenn es außerhalb seines Codes verwenden werden soll. C# hat in Form von Erweiterungsmethoden eine bessere Lösung für dieses Szenario.

Erweiterungsmethoden sind eine Möglichkeit, zusätzliche Funktionalitäten zu einer vorhandenen Klasse hinzuzufügen, ohne sie unterzuklassifizieren oder Zugang zum Quellcode zu haben. Mit einer einfachen Syntax wird es plötzlich ganz banal, alle benötigten zusätzlichen Funktionalitäten hinzuzufügen, ohne den vorhandenen Code zu sprengen und ohne die Erfordernis zahlreicher Casting-Anfragen.

Sobald eine Erweiterungsmethode erstellt wurde und sich innerhalb des Anwendungsbereichs befindet, ist die Methode für alle Instanzen der Klasse, zu der sie hinzugefügt wurde, verfügbar. In vielerlei Hinsicht bringen Erweiterungsmethoden etwas von der Flexibilität mit sich, die Sprachen wie Ruby und Python ihren Entwicklern geben, arbeiten aber immer noch innerhalb der C#-Sprache. Erweiterungsmethoden werden innerhalb einer statischen Klasse platziert und sollten als statisch deklariert werden. Von da an sehen Erweiterungsmethoden aus wie jede übliche Methode, abgesehen von einer kleinen Änderung. Der erste Parameter sollte diese Form haben: TypeToExtend parametername. Dies zeigt dem Compiler an, dass eine Erweiterungsmethode für die Klasse TypeToExtend erstellt wird. Außerdem deklariert es, dass sich innerhalb des Methodenkörpers eine Variable namens "parametername" befindet, die den Wert der Instanz darstellt.

Hier ein Beispiel: Zur String-Klasse wird eine Matches-Methode hinzugefügt, die ein Muster für einen regulären Ausdruck und reguläre Ausdrucksoptionen anzeigt. Wenn die Methode unter Verwendung des String ausgeführt wird, erzeugt sie unter Nutzung der Muster und Optionen ein Regex-Objekt und gibt das Matches-Objekt aus dem Regex aus. Außerdem wird eine Überlastung dieser neuen Methode erzeugt, die keine Übergabe von Optionen benötigt und nur die Regex-Standardoptionen verwendet. Der Code lautet wie folgt:



Dieser Code verwendet die Parameterquelle als Variable innerhalb der Methode. Doch wenn die Methode tatsächlich aufgerufen wird, ist die Quelle keinesfalls ein Parameter, der per Aufrufcode an die Methode übergeben wird. Nachfolgend ein Beispiel für einen Aufruf dieser Erweiterungsmethode:



Wie man sehen kann, wird der Quellparameter tatsächlich nicht an die Methode übergeben. Außerdem ist ersichtlich, wie die Erweiterungsmethode nahtlos Mitglied der Stringklasse geworden ist, ohne dass ein Unterklassen-String nötig war. Für die Erweiterungsmethode ist es wichtig, festzuhalten, dass die Klasse, die sie enthält, für den Aufruf-Code verfügbar sein und sich innerhalb des Anwendungsbereichs befinden muss. Die Alternative wäre, die Erweiterungsmethode als statische Methode der Klasse, die sie enthält, zu deklarieren. In diesem Fall lautet der Code wie folgt:



Erweiterungsmethoden sind bei Weitem kein vollständiger Ersatz für Klassenvererbung. Es wird immer einen Bedarf an spezialisierten Versionen für Klassen geben. Doch Erweiterungsmethoden sind wirklich von Vorteil, wenn begrenzte Funktionalitäten hinzugefügt werden sollen - die Probleme, die eine Unterklassifizierung mit sich bringt, können so einfach umgangen werden. Weiterführende Details zu Erweiterungsmethoden stehen in den Sprachspezifikationen[1] (Word-Format) von C# 3.0.

Erweiterungsmethoden gehören absolut in jedes Toolkit. Nach ein oder zwei Anwendungen zeigen sich die Vorteile dieser Technik deutlich.

URLs in diesem Artikel:
[1] = http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc