Вот как я понимаю, идея кэширования состоит в том, чтобы повторно использовать выражения везде, где это возможно, чтобы уменьшить динамические и статические издержки при оценке динамических выражений.
представьте себе динамическое выражение
>> a + b
Затем в первый раз, когда нужно будет создать дерево выражений / синтаксиса (если оно не существует). Это типа
if a is an int and not null and b is an int and not null then result = a + b
Это, по сути, правило, которое можно оценить, и если оно истинно, можно использовать выражение. Следовательно, у нас есть кэш 1-го уровня.
Уровень 2 аналогичен, но более сложное правило, вероятно, в соответствии с:
if a is an int and not null and b is an int and not null then result = a + b
if a is string and b is an int then do Int.Parse(a) + b
etc...
Уровень 3 еще сложнее.
если выражение не может быть найдено, то создается новое выражение и добавляется в один из кешей (хотя я ничего об этом не знаю).
Насколько я понимаю, l1 - это 1 правило, l2 - около 10 правил, а l3 - около 100 правил.
Я получил все это от прочтения этой темы в Google.
- http://dotnetslackers.com/articles/csharp/Dissecting-C-Sharp-4-0-Dynamic-Programming.aspx
- http://msdn.microsoft.com/en-us/magazine/cc163344.aspx
и некоторые другие, которые я сейчас не могу вспомнить.