HowTo: Extension Methods
17. Februar 2009 – 22:01Dieses How-To wurde ebenfalls auf XNA.mag veröffentlicht und kann auch dort diskutiert werden.
Einleitung
In diesem kleinen How-To möchte kurz erklären was Extension Methods sind, wie man sie anwendet und auf was man achten muss.
Umsetzung
Was sind überhaupt Extension Methods?
Extension Methods sind integraler Bestandteil von C# 3.0 und dem .Net-Framework 3.5!Diese Methoden erlauben es vorhandene Typen zu erweitern, ohne eine abgeleitete Klasse zu implementieren oder den ursprünglichen Typ erneut kompilieren zu müssen. Extension Methods sind spezielle statische Methoden werden aber wie Instanzmethoden aufgerufen. Instanzmethoden haben aber Vorrang gegenüber Extension Methods, dass heißt eine vorhandene Methode kann nicht durch eine Extension Method ersetzt werden. Weiterhin können sie nur auf öffentliche Member und Methoden des Types den sie erweitern zugreifen, da sie sonst das Prinzip der Kapselung verletzt werden würden.
Kleines Beispiel gefällig?
namespace ExtensionMethods { public static class Extensions { public static string EliminateWhiteSpace(this string param) { return param.Replace(' ', string.Empty); } } }
Der erste Paramter in einer Extension Method wird mit dem Operator this versehen und entspricht dem Typ auf dem die Extension Method angewendet wird. In diesem Falle string. Die Klasse und die eigentliche Methode muss static sein.
Wie verwendet man jetzt diese Methode:
using ExtensionMethods; namespace ConsoleApplication { class Program { static void Main(string[] args) { Console.WriteLine("Hallo Welt!".EliminateWhiteSpace()); Console.ReadLine(); } } }
Das funktioniert da der Compiler die Extension Methods auflöst wenn der Namespace, in dem die Extension Method definiert wurde, an der gewünschten Stelle eingebunden wurde. Das Einbinden des Namespaces ist wichtig und muss explizit geschehen. Wie erwähnt wird also die Extension Method wie eine Instanzmethode aufgerufen, liegt aber nach dem kompilieren in der IL (intermediate language) als statischer Aufruf vor. Im Endeffekt wird also daraus:
Console.WriteLine(Extensions.EliminateWhiteSpace("Hallo Welt!"));
Ein weiteres Beispiel, welches nicht ganz so konstruiert ist. Bei der Spiele/Grafikprogrammierung ist es wichtig zu wissen wieviel Zeit zwischen zwei Frames (Bildern) vergangen ist. Das sieht folgendermaßen aus:
float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;
Die Extension Method dazu:
public static float GetElapsedSeconds(this GameTime gameTime) { return (float)gameTime.ElapsedGameTime.TotalSeconds; }
Und nun der neue Aufruf:
float dt = gameTime.GetElapsedSeconds();
Conclusion
Extension Methods bieten eine gute Möglichkeit vorhande Funktionlität zu erweitern und lassen sich im ‚Client-Code‘ intuitiv einsetzen. Weiterhin verbessert sich zumeist die Lesbarkeit des Codes (syntaktischer Zucker). Trotzdem sollte man sparsam mit ihnen umgehen und sie nur anwenden wenn sie unbedingt benötigt werden, da es schnell zu Wildwuchs kommen kann und der Code schlecht wartbar wird.
Interessante Links/Quellen
MSDN Prgramming Guide zu Extension Methods
Extension Methods und genauerer IL-Betrachtungen
Extension Methods in Bezug auf XNA
One Response to “HowTo: Extension Methods”
Sehr gelungene Einführung ist das Thema. Auch für jemanden wie mich der sich nicht dauerhaft mit der Thematik C# beschäftigt war es gut verständlich.
Weiter so…
By Schmidt on Feb. 19, 2009