2010-02-02 4 views
9

Ho una semplice domanda: qual è il vantaggio dell'istanziazione di un delegato C# rispetto al solo passaggio del riferimento alla funzione? Quello che voglio dire è:C# Delegate l'istanza contro il passaggio del metodo

Perché:

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

quando si può fare:

Thread t = new Thread(SomeObject.SomeMethod); 

Entrambi saranno compilare e lavorare nella mia esperienza ... mi sto perdendo qualcosa?

+0

possibile duplicato di [Qual è la differenza tra la nuova Action() e una lambda?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-tra between-new-action-and- a-lambda) – nawfal

risposta

6

Fintanto che il metodo metodo SomeObject.SomeMethod ha un metodo con tipo di ritorno void e non richiede alcun parametro, non vi è alcuna differenza. Questo perché ThreadStart è definito come delegate che restituisce void e non accetta parametri e pertanto esiste una conversione implicita dal gruppo di metodi SomeObject.SomeMethod a ThreadStart. Pertanto, entrambi stanno invocando il sovraccarico Thread(ThreadStart) del costruttore Thread.

La sezione pertinente della specifica della lingua è §6.6 (Conversioni di gruppo metodo).

Ho una semplice domanda: qual è il vantaggio dell'istanziazione di un delegato C# rispetto al solo passaggio del riferimento di funzione?

Quindi, solo una correzione della terminologia qui. Con

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

la cosa indicata con someObject.SomeMethod è un gruppo metodo. Si può semplicemente pensare a come l'insieme di metodi sovraccaricati può essere consultato usando la notazione someObject.SomeMethod.

+1

'someObject.SomeMethod()' è anche un gruppo di metodi? –

+1

@John Feminella: No, sarebbe un'invocazione di metodo. – jason

+0

Hmm, ok. Cosa succede se 'SomeMethod' ha diversi overloads la cui firma corrisponde a' SomeMethod (...) ', dove' ... 'sono parametri arbitrari? È un gruppo di metodi allora, dal momento che potrebbe fare riferimento a uno dei vari metodi e non è stato ancora risolto? –

4

Il compilatore dedurrà che quando hai digitato il codice più corto, intendevi il codice più lungo. Non c'è differenza nell'effetto finale. Se vuoi la chiarezza del costruttore completo, puoi inserirla; se si desidera la brevità del solo gruppo di metodi, è possibile consentire al compilatore di dedurre il costruttore. È solo una scelta stilistica.