4 Stimmen

Erweiterung oder statische Funktion?

Ich entwickle ein mittelgroßes Projekt, bei dem die Leistung wirklich wichtig ist. Ich konnte den Unterschied zwischen statischen und Erweiterungsfunktionen nicht finden (eigentlich kann ich ihn nicht verstehen).

zum Beispiel:

public static class My
{
    public static Vector2 MyTransform(this Vector2 point, float Rotation)
    {
        //....
       return MyVector;
    }

    public static Vector2 MyTransform(Vector2 point, float Rotation)
    {
        //....
       return MyVector;
    } 
}

Diese Funktionen werden auf dieselbe Weise verwendet, nur die Erweiterungsfunktion wird über ihre Instanz aufgerufen:

  1. Vector2 calc = myVector.MyTransform(0.45f);
  2. Vector2 calc = My.MyTransform(myVector, 0.45f)

Welche davon ziehen Sie es vor zu verwenden, oder wird bevorzugt zu verwenden und warum?

Danke!

9voto

Jon Skeet Punkte 1325502

Es wird keinen Unterschied in der Leistung geben - ein Aufruf der Erweiterungsmethode von

var result = foo.MyTransform(rotation);

wird einfach vom Compiler in folgendes umgewandelt:

var result = My.MyTransform(foo, rotation);

Das bedeutet nicht, dass Erweiterungsmethoden überall verwendet werden sollten - aber es scheint, dass dies ein angemessener Anwendungsfall ist, es sei denn, Sie könnten es tatsächlich zu einer Instanzmethode auf Rotation machen:

var result = rotation.Apply(foo);

(Übrigens würde ich Ihnen dringend empfehlen, Ihre Namen zu überdenken, um den .NET-Namenskonventionen zu folgen.)

5voto

Daniel Hilgarth Punkte 165768

Erweiterungsmethoden SIND statische Methoden. Sie sind nur syntaktischer Zucker. Der Compiler erstellt einen normalen Aufruf der statischen Methode. Das bedeutet, sie sind äquivalent.

3voto

Sergey Kalinichenko Punkte 694383

Die beiden Funktionen werden auf genau die gleiche Weise implementiert. Logischerweise ermöglichen Ihnen Erweiterungsmethoden jedoch, gemeinsame Funktionalitäten über mehrere Schnittstellen hinweg bereitzustellen, sodass es mehr als nur "syntaktischer Zucker" ist.

2voto

Matteo Mosca Punkte 7220

Sie werden "Erweiterungsmethoden" genannt und nicht erweitert.

Eine Erweiterungsmethode ist nur ein bequemer Weg, um es so aussehen zu lassen, als ob es Teil der Objektdefinition wäre.

Wenn Sie Folgendes schreiben:

public static void DoSomething(this MyObject myObject) { }

Bedeutet das, dass Sie es so aufrufen können, von einer Instanz von MyObject:

myObject.DoSomething();

Wenn Sie das Schlüsselwort this in der Methodendefinition weglassen, können Sie es nicht so aufrufen, sondern nur so:

DoSomething(myObject);

Beachten Sie, dass während der erste Aufruf nur möglich ist, wenn Sie die Methode als Erweiterungsmethode schreiben (mit dem Schlüsselwort this), der zweite in beiden Fällen möglich ist.

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