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?
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?
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.
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.
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();
Ergänzend zu Preet Sanghas Erklärung:
Intellisense zeigt die Erweiterungsmethoden mit einem blauen Pfeil an (z.B. vor "Aggregate<>"):
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.
Sie sind Erweiterungsmethoden . Willkommen in einer ganz neuen fließende Welt . :)
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.