2013-04-26 11 views
6

Gli alberi di espressione sono una funzione linguistica di base o una funzione dell'oggetto/libreria BCL? È qualcosa che non puoi costruire senza le funzionalità linguistiche di base di C#?Espression Trees è una funzionalità di base del linguaggio C#?

+4

Nella misura in cui esiste un cast implicito da una lambda della forma 'Func ' a 'Expression >' che il compilatore deve eseguire in fase di compilazione, penso di si. –

+1

È possibile utilizzare i metodi builder invece di tradurre un'espressione lambda in un albero di espressioni. Ma è * molto * più prolisso. – CodesInChaos

+0

Di quale parte della funzione stai chiedendo? – SLaks

risposta

3

No, gli alberi di espressione non sono una lingua. Sono utilizzabili da qualsiasi linguaggio .NET, quindi non possono essere specifici per C#. Sono tipi CLR ordinari definiti in un assembly incorporato.

La costruzione tramite espressioni lambda (e LINQ) è specifica C#. Ma puoi sempre costruire un equivalente Expression manualmente. Il compilatore C# non fa altro che emettere chiamate ai ben noti metodi di costruzione statica Expression. È possibile esaminare ciò che il compilatore emette decompilando il binario con Reflector configurato su una versione .NET precedente.

Se gli alberi di espressione utilizzano le API interne di .NET Framework è una domanda non correlata, ma non riesco a pensare a nessuna ragione per cui dovrebbero averne bisogno.

+1

"No, non sono una caratteristica del linguaggio. Essi sono utilizzabili da qualsiasi linguaggio .NET in modo che non possano essere C# specifica." - Non è giusto. Sono * una * funzione del linguaggio di C# ... e F # ... e Visual Basic ... ---- Ognuno ha bisogno di conoscere la sintassi del linguaggio e tale da creare effettivamente un albero di espressioni dal testo nel file sorgente. –

+1

@Timothy: No, ti riferisci alle espressioni _lambda_. _Queste_ sono caratteristiche linguistiche. Le classi 'Expression' sono solo classi .NET regolari. Tutto ciò che può utilizzare le classi .NET può utilizzare le classi 'Expression'. –

+0

@JeffMercado Oh ... giusto. Stavo pensando che la domanda iniziale riguardasse la funzione lambda-expression-to-'Expression', non le stesse classi di 'Expression'. Sì, quelli non sono funzionalità linguistiche. :) –

0

Come si può vedere dalla definizione della classe Expression, è definita nello spazio dei nomi System.Linq.Expressions. In questo caso, Expression non è una funzione del linguaggio C#: è una classe consumabile da tutte le lingue che hanno come target il CLR.

Qui, ad esempio, è presente un articolo su MSDN intitolato "Expression Trees (C# and Visual Basic)" che illustra come creare e utilizzare alberi di espressioni mediante C# e VB.NET.

Problemi correlati