Многократный вызов Compile () для выражения <T>и кэширование - PullRequest
1 голос
/ 07 марта 2011

Я не нашел никакой информации на MSDN относительно этой проблемы.

Если мы создадим Expression<Func<T>> и вызовем Compile() для него, CLR будет кешировать скомпилированные результаты, поэтому любые последующие вызовы Compile() для того же выражения не окажут большого влияния, поскольку CLR вернет ранее скомпилированный Func<T> из кеша внутренней памяти?

Лямбда-выражения AFAIK неизменны, поэтому внутреннее кэширование действительно имеет смысл.

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Нет, он просто возвращает делегата скомпилированной версии. Само выражение не затронуто.

Expression<Func<T>> expression = ...;
Func<T> compiled = expression.Compile();
T value = compiled();
0 голосов
/ 20 мая 2014

Немного некромантии здесь в виде скрипта linqpad. Это кеширует скомпилированное значение в Слабой таблице

void Main()
{
    Expression<Func<string>> expression = () => "hello";
    expression.ExecuteWithCachedCompile().Dump(); //ta-da!
}
static class CachedCompileExtension
{
    private static readonly ConditionalWeakTable<object, object> props = new ConditionalWeakTable<object, object>();

    public static T ExecuteWithCachedCompile<T>(this Expression<Func<T>> key)
    { 
        var func = (Func<T>) props.GetValue(key, (k) => key.Compile());       
        return func();
    } 
}
...