Я пытаюсь понять крайний случай кэширования делегатов на основе компилятора, чтобы избежать выделения памяти.
Например, насколько я понимаю, этот делегат кэшируется для одного экземпляра и используется повторно, потому что он не закрывается ни по одной локальной переменной:
int[] set = new [] { 1, 2, 3, 4, 5, 6 };
var subset = set.Where(x => x % 2 == 0);
Теперь у меня есть несколько случаев, когда мой сгенерированный код может захотеть вызвать делегат напрямую, поэтому анонимный метод не является допустимым C #, например:
var result = (x => x % 2 == 0).Invoke(5); // Invalid
Чтобы обойти это, я вижу два варианта:
- Использование конструктора:
var result = (new Func<int, bool>(x => x % 2 == 0)).Invoke(5);
- Приведение анонимного делегата:
var result = ((Func<int, bool>)(x => x % 2 == 0)).Invoke(5);
Я предполагаю, что компилятор не будет кэшировать делегат в опции # 1, но я не уверен, будет ли это в # 2.
Это где-нибудь задокументировано?