2015-02-06 15 views
6

In un excellent answer about starting a timer immediately, ho potuto vedere il codice seguente:(_) => DoWork(); In che modo un carattere di sottolineatura è valido come parametro di delegato anonimo?

timer.Elapsed += timer_Elapsed; 
    ThreadPool.QueueUserWorkItem((_) => DoWork()); 
... 

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { 
    DoWork(); 
} 

void DoWork() { 
    // etc... 
} 

ho provato io stesso, e ho urtato su questa linea, in cui ho pensato che ci fosse un errore di battitura nella costruzione delegato anonimo:

       What? 
            | 
            V 
    ThreadPool.QueueUserWorkItem((_) => DoWork()); 

Quale regola nascosta rende un trattino di sottolineatura "_" accettabile come nome parametro in un delegato anonimo?

+5

La stessa regola che rende un singolo underscore accettabile come nome parametro nel caso generale? '_' è un identificatore valido in C#. –

+0

Non lo sapevo e sono molto sorpreso ... Grazie per aver segnalato questo. – Larry

+0

Voglio contrassegnare come duplicato di [questo] (http://stackoverflow.com/questions/950616/what-characters-are-allowed-in-c-sharp-class-name) ma non voglio Mjolnir, quindi ecco il mio voto. – Rawling

risposta

10

Un carattere di sottolineatura è un normale carattere identificatore in C#. Ad esempio my_money è valido. Quindi _ è valido come x.

Si potrebbe anche scrivere _ => DoWork() che penso sia più comune.

+6

Vale anche la pena notare che concettualmente un segno di sottolineatura indica che il parametro che lo rappresenta non è utilizzato nella funzione interna, ma deve essere fornito per soddisfare il compilatore. Fondamentalmente un modo stenografico per dire "non ti preoccupare". –

+0

TIL '_' è un nome di variabile valido – Shekhar