Albero delle espressioni e metodo di compilazione

c# expression-trees lambda

Domanda

Questo è tutto il metodo di Compile del tipo di Expression . Mi spiace essere ingenuo da quando sono in ritardo. Ho letto delle espressioni di costruzione per abilitare la modifica dinamica del codice eseguibile. E ha senso per me quando si tratta di emettere un'espressione lambda da un dato albero di espressioni, purché per i vari input / ambiente (diciamo per valori diversi per ogni costante / parametro / espressione del membro). Presumo, sarebbe ideale se potessi memorizzare (riutilizzare) lambda quelli che sono generati / compilati da un albero di espressioni purché non ci siano cambiamenti nell'ambiente.

Domanda : CLR emette sempre espressione lambda anche se non ci sono cambiamenti nell'ambiente? In tal caso, qual è il modo migliore per evitare la compilazione di espressioni da lambda se non vi è alcun cambiamento nell'ambiente?

Risposta accettata

Le espressioni Lambda sono solo un modo per rappresentare un pezzo di codice: chiamalo, chiamalo, confronta questi argomenti, restituisci qualcosa, ecc. Quasi nello stesso modo in cui lo fai dall'editor di codice, o JIT da IL.

Compile emette un delegato da un'espressione lambda particolare. Una volta che hai compilato lambda in delegato, il delegato rimane invariato (anche il lambda rimane invariato, perché è immutabile).

Questo non significa che il delegato non può accettare alcun argomento o chiamare alcun metodo di alcun oggetto. Questo significa solo che l'IL del delegato non cambia. E sì, puoi memorizzare nella cache l'istanza delegata compilata.


Risposta popolare

CLR non memorizza nella cache espressioni lambda, Compile() ogni volta restituisce un nuovo delegato.

Ma dovrebbe essere facile da memorizzare nella cache, tramite qualcosa del genere:

public Func<T> Get<T>(Expression<Func<T>> expression)
{
    string key = expression.Body.ToString();

    Func<T> result;
    if (!_cache.TryGetValue(key, out result)) {
        result = expression.Compile();
        _cache.Add(key, result);
    }

    return result;
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché