2009-04-23 5 views
-1

Diese Frage hat bereits eine Antwort hier:
What are Extension Methods?5 Antworten
Usage of Extension Methods9 Antworten
What Advantages of Extension Methods have you found? [closed]30 AntwortenWas sind Erweiterungs-Methoden - und was unterscheidet sie von anderen Methoden?

Also ich in den Begriff laufen „Verlängerungs- Methoden "häufig, beim Lesen über. Net und intellisensing (!) um ...

Was sind Erweiterungsmethoden - und was unterscheidet sie von anderen Methoden?

+0

Neben den doppelten Links finden Sie auch http://msdn.microsoft.com/en-us/library/bb383977.aspx (der MSDN-Artikel). – Noldorin

+0

Ich suche zuerst nach 10 Minuten, fand aber keine befriedigende Antwort. Wie ich diesen Beitrag verpasst habe: http://StackOverflow.com/Questions/403539/What-are-Extension-Methods ... Ich weiß es nicht. Das ist eine stellare Antwort, genau das, wonach ich gesucht habe. Schließen wir diesen Beitrag. – Kjensen

+0

Kein Problem ... Ich bin froh, dass Sie eine nützliche Antwort gefunden haben. – Noldorin

Antwort

2

Sie sind statische Methoden, die zu anderen Typen hinzugefügt werden können, ohne den ursprünglichen Typ zu ändern.

Angenommen, Sie möchten ToInt() in einer Zeichenfolge aufrufen. Sie können eine Methode wie folgt erstellen:

public static int ToInt(this string value){ return Int32.Parse(value); } 

Jetzt sagen Sie einen Text haben auf Ihrer Webseite namens Port Sie es als int wie folgt zu erreichen:

int port = Port.Text.ToInt(); 

der realen Welt Verwendung von Erweiterungsmethoden ist in der Regel viel nützlicher als das und wird stark von Fluent APIs und testing Frameworks verwendet.

UPDATE: Eine andere gute Verwendung von Erweiterungen ist, Basisklasse wie Standardverhalten für Schnittstellen bereitzustellen. Viele gängige Testmethoden hängen von Schnittstellendefinitionen und der Fähigkeit ab, diese Schnittstellen zu überspielen. Leider verliert alles, was auf Schnittstellen basiert, jedoch einige der Vorteile der Vererbung. Erweiterungsmethoden können einige der Vorteile von Basisklassen ohne die Verschmutzung der Schnittstellen hinzufügen.

Zum Beispiel sagen, ich habe eine Window Klasse Basis wie diese

definiert
public class Window 
{ 
    public void Show(object owner){...} 
    public void Show(){ Show(null); } 
} 

Jetzt habe ich eine IWindow Schnittstelle von dieser Klasse extrahieren möchten. Ich möchte nicht wirklich verlangen, dass jedes Objekt, das von IWindow abgeleitet ist, die zweite Show Methode implementieren muss, da es nur eine grundlegende Überlastung ist. So kann ich meine Schnittstelle wie folgt definieren:

public interface IWindow 
{ 
    void Show(object owner); 
} 

Und eine Erweiterung Methode wie folgt:

public static void Show(this IWindow window) 
{ 
    window.Show(null); 
} 
0

Erweiterungsmethoden sind statische Methoden in der eigenen Klasse, Sie können Typen verwenden, in der Regel nicht in Ihrem eigenen Code.

Zum Beispiel können Sie schreiben:

public static void RemoveS(this string value) 
{ 
    value = value.Trim("s"); 
} 

Und diese Methode wird auf alle „string“ Typen in Ihrem System angehängt werden, solange der Namensraum, wo Sie schrieb es an den Compiler zur Verfügung steht.

Like:

string foo = "Somethings"; 
string betterfoo = foo.RemoveS(); 

See: http://www.csharphelp.com/archives/archive148.html für mehr Hilfe.

0

Erweiterungsmethoden sind Methoden, die Sie erstellen, um einen bereits vorhandenen Typ (string, int, char oder benutzerdefinierten Typ) zu erweitern.

Dies ermöglicht Ihnen das Hinzufügen von Funktionalität zu integrierten oder Typen von anderen (in einer DLL zum Beispiel) erstellt.

0

Erweiterungsmethoden statische Funktionen, die zu statischen Klassen hinzugefügt werden, die der Compiler Ihnen ermöglichen kann, als Instanzmethode auf einem anderen Typ verfügbar zu machen. Angenommen, ich wollte der Klasse Control eine Funktion mit dem Namen "MakeInvisible()" hinzufügen, die sie unsichtbar machen könnte (die Tatsache ignorierend, dass eine solche Methode bereits in "Hide()" existiert). Ich würde es so machen.

public static class ControlExtensionClass 
{ 
    public static void MakeInvisible(this Control control) 
    { 
     control.Visible = false; 
    } 
} 

Wenn ich diese Klasse irgendwo in meinem referenzierten Assemblys haben, dann kann ich diese überall tun ..

Control c; 

c.MakeInvisible(); 

Die ‚this‘ Schlüsselwort ist das, was diese Methode eine Erweiterung macht. Dies weist den Compiler an, diese Methode der Klasse Control hinzuzufügen und einen Verweis auf die Entität in der angegebenen Variablen bereitzustellen.

1

Erweiterungsmethoden sind statische Methoden mit einer speziellen Syntax für den ersten Parameter. Der Compiler ermöglicht es, sie syntaktisch wie Instanzmethoden zu verwenden.

public class ExampleClass 
{ 
    public String Value { get; set; } 
} 

Nun könnte man ein Verfahren PrintValue() durch Modifizieren der Klasse einzuführen.

public class ExampleClass 
{ 
    public String Value { get; set; } 

    public void PrintValueInstance() 
    { 
     Console.WriteLine(this.Value); 
    } 
} 

könnten Sie auch eine statische Methode in irgendeiner Klasse erstellen - ExampleClass oder andere.

public class AnyClass 
{ 
    public static void PrintValueStatic(ExampleClass exampleClass) 
    { 
     Console.WriteLine(exampleClass.Value); 
    } 
} 

Und Sie können eine Erweiterungsmethode erstellen - es ist ähnlich wie die statische Methode, sondern markiert den ersten Parameter mit this.

public class ExtensionClass 
{ 
    public static void PrintValueExtension(this ExampleClass exampleClass) 
    { 
     Console.WriteLine(exampleClass.Value); 
    } 
} 

Die ussage ist dann wie folgt.

So ermöglicht der Compiler die Verwendung einer statischen Methode mit Instanzmethoden-Syntax für Objekte, die dem Typ des ersten Parameters entsprechen. Auf diese Weise können Sie Methoden zu einer Klasse hinzufügen, ohne die Klasse ändern zu müssen. Natürlich gibt es eine Einschränkung - Sie können nur innerhalb einer Erweiterungsmethode auf öffentliche Mitglieder zugreifen.

Sie können auch Erweiterungsmethoden für Schnittstellen definieren, die dann allen Klassen zur Verfügung stehen, die die Schnittstelle implementieren.

public interface ISomeInterface 
{ 
    Int32 Foo(Int32 value); 
    Int32 Bar(String text); 
} 

public static class SomeInterfaceExtension 
{ 
    public static Int32 FooFooBar(this ISomeInterface @this, String text) 
    { 
     return @this.Foo(@this.Foo(@this.Bar(text)); 
    } 
} 

Nun wird das Verfahren FooFooBar() ist auf allen Klassen availiable ISomeInterface implementieren.

public class NiceClass : ISomeInterface 
{ 
    public Int32 Foo(Int32 value) 
    { 
     return value * value; 
    } 

    public Int32 Bar(String text) 
    { 
     return text.Length; 
    } 
} 

Jetzt können Sie die Erweiterungsmethode auf NiceClass Instanz verwenden.

NiceClass niceClass = new NiceClass(); 

Console.WriteLine(niceClass.FooFooBar("ExtensionMethodExample")); 
Verwandte Themen