HowTo: Extension Methods

17. Februar 2009 – 22:01

Dieses 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

C# 3.0 Extension Methods

Extension Methods und genauerer IL-Betrachtungen

Extension Methods in Bezug auf XNA

Extension Methods in Bezug auf XNA 2

Extension Methods in Bezug auf XNA 3

  1. One Response to “HowTo: Extension Methods”

  2. 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

Post a Comment