2010-02-02 3 views
9

Ich habe eine einfache Frage: Was ist der Vorteil der Instanziierung eines C# -Delegate im Gegensatz zu nur die Funktionsreferenz übergeben? Was ich meine ist:C# Delegierten Instanziierung vs Just übergeben der Methode Referenz

Warum tun:

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

Wenn Sie tun können:

Thread t = new Thread(SomeObject.SomeMethod); 

Beide werden kompilieren und arbeiten in meiner Erfahrung ... bin ich etwas fehlt?

+0

möglich Duplikat [Was ist der Unterschied zwischen dem neuen Aktion ist() und ein Lambda?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal

Antwort

6

Solange die Methodengruppe SomeObject.SomeMethod eine Methode mit dem Rückgabetyp void hat und keine Parameter enthält, gibt es keinen Unterschied. Dies liegt daran, dassals delegate definiert ist, das void zurückgibt und keine Parameter akzeptiert. Daher gibt es eine implizite Konvertierung von der Methodengruppe SomeObject.SomeMethod zu . Somit rufen beide die Überlastung Thread(ThreadStart) des Thread Konstruktors auf.

Der relevante Abschnitt der Sprachspezifikation ist §6.6 (Methodengruppenkonvertierungen).

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

Also, nur eine Korrektur der Terminologie hier. Mit

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

die von someObject.SomeMethod bezeichnet, was eine Methodengruppe. Sie können es einfach als die Menge überladener Methoden betrachten, die mit der Notation someObject.SomeMethod nachgeschlagen werden kann.

+1

Ist 'someObject.SomeMethod()' auch eine Methodengruppe? –

+1

@John Feminella: Nein, das wäre eine Methodenaufrufung. – jason

+0

Hmm, okay. Was wäre, wenn 'SomeMethod' mehrere Überladungen hätte, deren Signatur mit' SomeMethod (...) 'übereinstimmt, wobei' ... 'willkürliche Parameter sind? Ist es eine Methodengruppe, da sie sich auf eine von mehreren Methoden beziehen kann und noch nicht aufgelöst wurde? –

4

Der Compiler wird folgern, dass Sie den längeren Code bedeuteten, wenn Sie den kürzeren Code eingaben. Es gibt keinen Unterschied im ultimativen Effekt. Wenn Sie die Klarheit des vollständigen Konstruktors haben wollen, können Sie es einfügen; Wenn Sie nur die Kürze der Methodengruppe wünschen, können Sie dem Compiler erlauben, auf den Konstruktor zu schließen. Es ist nur eine stilistische Entscheidung.

Verwandte Themen