La parola "delegato" è un po 'abusata. È più facile con classi e oggetti. Una "classe" è come un progetto per un oggetto. Un "oggetto" è un'istanza reale in memoria, che segue il progetto della classe.
Per i delegati usiamo la stessa parola, quindi sospetto la tua confusione. Considera il seguente codice:
class Main
{
public delegate int DelegateType(string x);
public int SomeFunction(string y) { return int.Parse(y)*2; }
public void Main()
{
DelegateType delegateInstance = null;
delegateInstance = SomeFunction;
int z = delegateInstance("21");
Console.WriteLine(z);
}
}
Questo codice emette "42".
Il DelegateType
è il tipo del delegato. Come una classe è un progetto per un oggetto, il delegato è un progetto per una funzione .
In seguito creiamo una variabile denominata delegateInstance
che è del tipo DelegateType
. A tale variabile, possiamo assegnare la funzione ANY che accetta un singolo parametro di stringa e restituisce un numero intero. Nota che abbiamo assegnato alla funzione stessa, non i risultati di tale funzione. È come se la variabile delegateInstance
sia ora un sinonimo di quella funzione. Infatti, come dimostrato in seguito, possiamo ora usare delegateInstance
per chiamare quella funzione! Proprio come se lo delegateInstance
fosse una funzione stessa. Ma dato che è variabile, possiamo anche fare tutte le stesse cose che usiamo di solito con le variabili - come passarle come parametri ad altre funzioni, o anche tornare da altre funzioni (Una funzione che restituisce una funzione! !)
OK, vediamo il codice che ti ha sconcertato.
public static void Save()
{
ThreadStart threadStart = delegate
{
SaveToDatabase();
};
new Thread(threadStart).Start();
}
private static void SaveToDatabase() { }
La prima cosa da notare è che è stato utilizzato un anonymous delegate
. Un altro uso improprio del termine. Quando compilato, si traduce in qualcosa di simile:
public static void Save()
{
ThreadStart threadStart;
threadStart = __ASDASDASD6546549871;
var tmp = new Thread(threadStart);
tmp.Start();
}
private static void SaveToDatabase() { }
private void __ASDASDASD6546549871()
{
SaveToDatabase();
}
Nota che la funzione anonima è stato effettivamente trasformato in una funzione del tutto regolare con un nome casuale, e quindi che la funzione è stato assegnato alla variabile threadStart
.
Quindi ora questo è proprio come nell'esempio sopra.Basta sostituire DelegateType
con ThreadStart
, delegateInstance
con threadStart
e SomeFunction
con __ASDASDASD6546549871
.
Ha senso ora?
perché non 'ThreadStart threadStart = new ThreadStart (SaveToDatabase);' – Anirudha
Non penso che venga restituito nulla poiché non esiste una parola chiave 'return'. Penso che venga creato un nuovo 'thread' che eseguirà il metodo indicato dal delegato. –
@ Some1.Kill.The.DJ: in effetti, a lungo termine, prenderà alcuni parametri. – Dave