2013-08-06 13 views
6

Capisco che il seguente codice C#:C# Compilato a CIL

var evens = from n in nums where n % 2 == 0 select n; 

compila a:

var evens = nums.Where(n => n % 2 == 0); 

Ma cosa vuol dire che si compila a questo? Avevo l'impressione che il codice C# fosse compilato direttamente in CIL?

risposta

2

Penso che tu abbia frainteso qualcosa. L'espressione di query:

var evens = from n in nums where n % 2 == 0 select n; 

non compila a:

var evens = nums.Where(n => n % 2 == 0); 

Piuttosto, le due linee di codice compilare direttamente a CIL. Accade solo che si compilino per (effettivamente) identici CIL. Il compilatore può convertire la query in una forma intermedia nel processo di analisi del codice della query, ma il risultato finale è, ovviamente, CIL.

+0

Ma nel libro di Bart De Smet "C# 4.0 Unleashed", a pagina 921, dice: "e in effetti viene compilato nella precedente sintassi". Dichiara esplicitamente che il primo viene compilato nel secondo. –

+1

@ user2063755: Potrebbe essere un errore nella terminologia. È mia opinione (che potrebbe anche essere imperfetta, ovviamente) che il primo venga tradotto in quest'ultimo come una fase di pre-compilazione. Quindi, come parte del processo di compilazione, il primo diventa il secondo e quindi il tutto viene compilato in CIL. – David

+0

grazie, ho corretto l'errore nella mia domanda. –

1

Questa è un'espressione C#/LINQ:

var evens = from n in nums where n % 2 == 0 select n;

Questa è un'espressione C# lambda:

var evens = nums.Where(n => % 2 == 0);

Sono entrambi C#, e entrambi get compilato in CIL.

Si può leggere di più su lambda qui:

Si può leggere di più su LINQ qui:

Le due espressioni sono equivalenti.

Uno fa NON ottenere "compilato" nell'altro. Onesto :)

+0

Capisco che entrambi (eventualmente) vengono compilati nello stesso CIL, ma l'autore del libro che sto leggendo dice che uno viene compilato nell'altro (presumo che intenda prima della compilazione in CIL), voglio trovarlo se questo è vero o no, o se l'autore ha commesso un errore e voleva dire che entrambi sarebbero stati compilati allo stesso CIL. –

+0

In senso stretto, o stai interpretando male quello che ha detto ... o si è fatto un misspoke. TUTTAVIA ... [LINQ] (http://msdn.microsoft.com/en-us/library/vstudio/bb397926.aspx) * doe * s dipende da .Net [lambdas] (http://msdn.microsoft. com/it-it/library/VStudio/bb397687.aspx). Forse è questo il punto che stava cercando di fare. IMHO ... – paulsm4

+0

SUGGESTION: familiarizza con Ildasm (è gratuito da Microsoft) e familiarizza con il modo in cui il codice C# viene tradotto in CIL. Ecco un paio di tutorial: http://msdn.microsoft.com/en-us/library/aa309387%28v=vs.71%29.aspx, http://www.rapidprogramming.com/tutorial/How-to -Usa-ILDASM - 450. Divertiti! – paulsm4

Problemi correlati