In base al codice this answer quando il codice utilizza le variabili locali dai metodi lambda interni, il compilatore genera classi aggiuntive che possono avere un nome come c__DisplayClass1
. Ad esempio il seguente codice (completamente inutile):Cosa significa "DisplayClass" quando si chiama lambda?
class Program
{
static void Main()
{
try {
implMain();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
static void implMain()
{
for (int i = 0; i < 10; i++) {
invoke(() => {
Console.WriteLine(i);
throw new InvalidOperationException();
});
}
}
static void invoke(Action what)
{
what();
}
}
emette il seguente stack di chiamate:
System.InvalidOperationException
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
at ConsoleApplication1.Program.implMain()
at ConsoleApplication1.Program.Main()
Nota che c'è c__DisplayClass2
lì che è un nome di una classe generata dal compilatore per tenere la variabile del ciclo.
Secondo this answerc__DisplayClass
"significa"
c -> metodo anonimo classe di chiusura ("DisplayClass")
Va bene, ma cosa significa "DisplayClass" significa qui?
Che cosa "visualizza" questa classe generata? In altre parole, perché non è "MagicClass" o "GeneratedClass" o un altro nome?
@PinnyM La risposta in là dice "c -> metodo anonimo classe di chiusura (" DisplayClass ")" e che in realtà non rispondi "cosa significa". – sharptooth
Sì, è la classe che avvolge una chiusura anonima del metodo. Come spiegato in questo post, i nomi sono arbitrari e possono cambiare in qualsiasi momento - non ha alcun significato oltre a quello. Rivolgiti ad Eric se vuoi maggiori dettagli ... – PinnyM
@PinnyM: Ok, allora la risposta è qualcosa come "questa è la cosa migliore che gli sviluppatori avrebbero potuto inventare in quel momento"? – sharptooth