10 Stimmen

C# Delegat-Instanziierung vs. Übergabe der Methodenreferenz

Ich habe eine einfache Frage: Was ist der Vorteil der Instanziierung eines C#-Delegaten im Gegensatz zu nur die Funktionsreferenz übergeben? Was ich meine ist:

Warum tun:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));

Wann Sie das tun können:

Thread t = new Thread(SomeObject.SomeMethod);

Meiner Erfahrung nach werden beide kompiliert und funktionieren... übersehe ich etwas?

6voto

jason Punkte 227577

Solange die Methodengruppe SomeObject.SomeMethod hat eine Methode mit Rückgabetyp void und ohne Parameter gibt es keinen Unterschied. Der Grund dafür ist ThreadStart ist definiert als ein delegate die zurückgibt void und nimmt keine Parameter an, so dass es eine implizite Konvertierung aus der Methodengruppe SomeObject.SomeMethod zu ThreadStart . Beide rufen also die Überlast auf Thread(ThreadStart)Thread Konstrukteur .

Der entsprechende Abschnitt der Sprachspezifikation ist §6.6 (Methodengruppenumwandlungen).

Ich habe eine einfache Frage: Was ist der Vorteil der Instanziierung eines C#-Delegaten im Gegensatz zu nur die Funktionsreferenz übergeben?

Also, nur eine Korrektur der Terminologie. Mit

class MyObject {
    public void SomeMethod() { }
}

MyObject someObject = new MyObject();

die Sache, die mit someObject.SomeMethod ist eine Methodengruppe. Man kann sie sich einfach als die Menge der überladenen Methoden vorstellen, die man mit der Notation someObject.SomeMethod .

1 Stimmen

Est someObject.SomeMethod() auch eine Methodengruppe?

1 Stimmen

@John Feminella: Nein, das wäre ein Methodenaufruf.

0 Stimmen

Hmm, okay. Was wäre, wenn SomeMethod hatte mehrere Überladungen, deren Signatur mit der von SomeMethod(...) donde ... sind willkürliche Parameter? Handelt es sich dann um eine Methodengruppe, da sie sich auf eine von mehreren Methoden beziehen könnte und noch nicht aufgelöst wurde?

4voto

Eric Lippert Punkte 628543

Der Compiler wird daraus schließen, dass Sie bei der Eingabe des kürzeren Codes den längeren Code gemeint haben. In der letztendlichen Wirkung gibt es keinen Unterschied. Wenn Sie die Klarheit des vollständigen Konstruktors wünschen, können Sie ihn einfügen; wenn Sie die Kürze nur der Methodengruppe wünschen, können Sie dem Compiler erlauben, den Konstruktor abzuleiten. Das ist nur eine stilistische Entscheidung.

0voto

herzmeister Punkte 10827

Das ist gleichbedeutend. Guter einführender Artikel zu diesem Thema: C#-Delegate, anonyme Methoden und Lambda-Ausdrücke - oh je!

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