364 Stimmen

Verwendung des Schlüsselworts "this" in formalen Parametern für statische Methoden in C#

Ich bin auf mehrere Fälle von C#-Code wie den folgenden gestoßen:

public static int Foo(this MyClass arg)

Ich habe keine Erklärung dafür finden können, was die this Schlüsselwort bedeutet in diesem Fall. Irgendwelche Erkenntnisse?

339voto

Preet Sangha Punkte 62622

Dies ist ein Erweiterungsmethode . Siehe hier für eine Erklärung .

Erweiterungsmethoden ermöglichen es Entwicklern, die c den ursprünglichen Typ neu zu kompilieren. Erweiterungsmethoden helfen, die Flexibilität der in dynamischen Sprachen beliebten "Duck-Typing"-Unterstützung mit der Leistung und Kompilierzeitvalidierung von stark typisierten Sprachen.

Erweiterungsmethoden ermöglichen eine Vielzahl von u das wirklich leistungsfähige LINQ-Abfrage-Framework zu ermöglichen... .

bedeutet dies, dass Sie Folgendes aufrufen können

MyClass myClass = new MyClass();
int i = myClass.Foo();

statt

MyClass myClass = new MyClass();
int i = Foo(myClass);

Dies ermöglicht die Konstruktion von fließende Übergänge wie unten angegeben.

96voto

James Wiseman Punkte 29172

Scott Gu's zitierter Blogbeitrag erklärt es sehr schön.

Für mich liegt die Antwort auf diese Frage in der folgenden Aussage in diesem Beitrag:

Beachten Sie, dass die statische Methode ab "this"-Schlüsselwort vor dem ersten Parameter-Argument vom Typ string. Dies sagt dem Compiler, dass diese [ ] zu Objekten des Typs "string" hinzugefügt werden soll. Innerhalb der Implementierung der Methode IsValidEmailAddress() Methodenimplementierung kann ich dann auf alle öffentlichen Eigenschaften/Methoden/Ereignisse des tatsächlichen String-Instanz zugreifen, die die Methode aufgerufen wird, und gebe true/false zurückgeben, je nachdem ob es sich um eine gültige E-Mail ist oder nicht.

14voto

Dean P Punkte 1233

Wäre es nicht praktisch, wenn man eine Liste<> ordentlich auflösen könnte, d.h. nicht nur das erste Element entfernen, sondern es auch zurückgeben könnte?

List<int> myList = new List<int>(1, 2, 3, 4, 5);

Ohne Erweiterungsmethoden:

public static class ContainerHelper
{
    public static T PopList<T>(List<T> list)
    {
        T currentFirst = list[0];
        list.RemoveAt(0);
        return currentFirst;
    }
}

Aufrufen dieser Methode:

int poppedItem = ContainerHelper.PopList(myList);

Mit Erweiterungsmethoden:

public static class ContainerHelper
{
    public static T PopList<T>(this List<T> list)//Note the addition of 'this'
    {
        T currentFirst = list[0];
        list.RemoveAt(0);
        return currentFirst;
    }
}

Aufrufen dieser Methode:

int poppedItem = myList.PopList();

12voto

Ergänzend zu Preet Sanghas Erklärung:
Intellisense zeigt die Erweiterungsmethoden mit einem blauen Pfeil an (z.B. vor "Aggregate<>"):

enter image description here

Sie brauchen eine

using the.namespace.of.the.static.class.with.the.extension.methods;

damit die Erweiterungsmethoden erscheinen und verfügbar sind, wenn sie in einem anderen Namespace liegen als der Code, der sie verwendet.

7voto

JP Alioto Punkte 44283

Sie sind Erweiterungsmethoden . Willkommen in einer ganz neuen fließende Welt . :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X