2015-02-06 8 views
6

W excellent answer about starting a timer immediately, mogłem zobaczyć następujący kod:(_) => DoWork(); W jaki sposób podkreślenie jest poprawne jako anonimowy parametr delegata?

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

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

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

próbowałem to sam, i wpadłem na tej linii, gdzie myślałem, że była literówka w anonimowym budowy Delegat:

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

Która z ukrytych reguł sprawia, że ​​podkreślenie "_" jest dopuszczalne jako nazwa parametru w anonimowym uczestniku?

+5

Ta sama reguła, która powoduje, że pojedyncze podkreślenie jest dopuszczalne jako nazwa parametru w ogólnym przypadku? '_' jest poprawnym identyfikatorem w C#. –

+0

Nie wiedziałem o tym i jestem bardzo zaskoczony ... Dzięki za wskazanie tego. – Larry

+0

Chcę oznaczyć jako duplikat [this] (http://stackoverflow.com/questions/950616/what-characters-are-allowed-in-c-sharp-class-name), ale nie chcę Mjolnir to, więc oto mój głos. – Rawling

Odpowiedz

10

Podkreślenie jest zwykłym znakiem identyfikacyjnym w języku C#. Na przykład my_money jest prawidłowe. Tak więc _ jest tak samo ważny jak x.

Można również napisać _ => DoWork(), które moim zdaniem jest bardziej powszechne.

+6

Warto również zauważyć, że konceptualnie podkreślenie oznacza, że ​​parametr, który reprezentuje, nie jest używany w funkcji wewnętrznej, ale musi zostać dostarczony w celu zaspokojenia kompilatora. Zasadniczo skrótowy sposób mówienia "nie przejmuj się mną". –

+0

TIL '_' jest prawidłową nazwą zmiennej – Shekhar

Powiązane problemy