Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...

News

Neues .NET 3.5 Feature: Extension Methods

Die erste interessante Spracherweiterung in .NET 3.5 die ich hier beschreiben möchte, ist die Extension Method (Erweiterungs-Methode).

Mit den Extension Methods lassen sich vorhandene Typen um bestimmte Features erweitern.

Eine Extension Method könnte zum Beispiel so aussehen:

public static class StringExtension
{
    public static bool IsNumeric(this string s)
    {
        int i = 0;
        return int.TryParse(s, out i);
    }
}

Die Methode muss in einer öffentlichen statischen Klasse definiert dein und selber öffentlich und statisch sein. Das besondere an dieser Methode ist der erste Parameter, der zusätzlich mit dem Schlüsselwort „this“ definiert wird. Das Schlüsselwort gibt dem Compiler an, dass die Methode dem angegebenen Typ (hier „string“) hinzugefügt werden soll.

Üblicherweise würde man eine statische Methode auf folgende Weise benutzen (was mit Extension Methods auch weiterhin funktioniert):

if (StringExtension.IsNumeric(this.txtInput.Text))
{
    this.lblAlert.Text = "Bitte geben Sie einen numerischen Wert ein.";
}

Aber die Extension Methode würde nicht so genannt werden, wenn sie nicht etwas erweitern würde. In unserem Fall wird er Typ „string“ um die Methode „IsNumeric()“ erweitert:

if (!this.txtInput.Text.IsNumeric())
{
     this.lblAlert.Text = "Bitte geben Sie einen numerischen Wert ein.";
}

Im IntelliSense ist eine Extension Methode mit dem Methoden Symbol und einem nach unten zeigenden blauen Pfeil gekennzeichnet. Und im Tooltip mit dem in Klammern stehenden Wort „extension“.

Extension Method

Alle weiteren Parameter die zusätzlich definiert werden, werden dann wie normale Parameter behandelt:

public static bool IsInArray(this string s, string[] array)
{
    foreach (string item in array)
        if (s == item)
            return true;
    return false;
}

string[] myarray = { "item1", "item2", "item3", "item4" };
string mystring = "item3";
if (mystring.IsInArray(myarray))
{
    // do anything here
}

Extension Method mit mehreren Parametern

Weitere Resourcen zu Extension Methods:
http://msdn.microsoft.com/msdnmag/issues/07/11/basicinstincts/default.aspx?loc=de
http://msdn2.microsoft.com/de-de/library/ms364047(vs.80).aspx#cs3spec_topic3
http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx
http://en.wikipedia.org/wiki/Extension_method

Share this post:
Posted: Mittwoch, 14. November 2007 21:23 von Jürgen Gutsch

Kommentare

jolli sagte:

hm, versteh nicht ganz den unterschied zu normalem ableiten eines typs? da erweitere ich ja auch ein objekt um neue funktionen?!

# November 14, 2007 21:43

Jürgen Gutsch sagte:

Hi jolli,

das ist richtig. Im Prinzip kann man auch ableiten.

Andererseits kannst du auf diese Art einfach eine Klasse  für mehrere Erweiterungen verschiedener Typen erstellen.

Worauf ich eigentlich hinaus will, ist dass diese Spracherweiterungen, die ich hier vorstelle (und vorstellen werde) Voraussetzung für LINQ sind.

Gruß
Jürgen

# November 14, 2007 21:57

Peter Bucher sagte:

Hallo zusammen

Schöner Artikel Jürgen.

@Jolli

Natürlich kannst du auch wie üblich von einem Typ ableiten, jedoch hast du dann einen neuen Typ. Hier erweiterst du einen bestehenden Typ und nutzt den _alten_ Typ.

Wie hier im Beispiel zu sehen, hängst du neue Membermethoden an einen Typ.

Ob diese Erweiterung jetzt gut oder schlecht ist, sei mal dahingestellt. Sie ist sicher interessant, birgt aber sicherlich auch einige Gefahren.

Wenn ich mit Extension Methods arbeite und den Code bspw. im Forum weitergebe, muss die andere Partei die selben Methoden auch haben, ansonsten nützt ihm der Code nicht viel.

# November 15, 2007 09:31

Rene Drescher-Hackel sagte:

Hallo Jürgen,

man muss aber aufpassen, dass man es nicht übertreibt mit ExtensionMethods. So würde gerade im Fall des Arrays auch der folgende Aufruf genügen:

if(array.Contains(s)){

// mach was...

}

Rene

# Dezember 16, 2008 08:55

Jürgen Gutsch sagte:

Hallo Rene,

es ist wie mit allem, wenn man es übertreibt, wird es meist unübersichtlich ... ;-)

Was die Arrays angeht, hast du ebenfalls recht. Allerdings war das oben ja nur ein Beispiel zur Veranschaulichung.

# Dezember 17, 2008 06:54

Jürgen Gutsch sagte:

Beim Zugriff auf XML mit bestimmten XML-Namespaces kommt es beim herkömmlichen Queries zu einem Fehler.

# August 13, 2009 11:30
Anonyme Kommentare sind nicht zugelassen