ссылки хранятся анонимными методами и лямбдами - PullRequest
0 голосов
/ 01 февраля 2012

Есть ли различия в ссылках, которые создаются в коде, сгенерированном для анонимных методов компилятором .NET 2.0 или 4.0, и в коде, сгенерированном для эквивалентной лямбды компилятором .NET 4.0? и, в частности, для указателя this: я знаю, что анонимные методы и лямбда-выражения являются функцией компилятора C #, и компилятор фактически создает вложенный класс с делегатом и всеми ссылками, необходимыми для внешних переменных, но this article on Реализация анонимных методов гласит, что ссылка хранится в указателе, и я не могу найти источник, описывающий что-то похожее для лямбда-выражений ... или я не нахожу ничего, потому что реализация для компиляции анонимных методов отображает 1 на 1 в lambdas?

Вот немного кода, чтобы продемонстрировать анонимные методы и лямбды:

    class AnonymousMethodMethodScope
    {
        private Func<bool> d;
        public Func<int, bool> d2;
        int j = 0;

        public void Test(int i)
        {
            d = new Func<bool>(delegate { j = 10; return j > i; });

            // what references does this anonymous method keep?
            d2 = new Func<int, bool>(delegate(int x) { return x == j; });

            Console.WriteLine("j = " + j + " result = " + d());
        }
    }

    class LambdaMethodScope
    {
        private Func<bool> d;
        public Func<int, bool> d2;

        public void Test(int i)
        {
            int j = 0;

            d = () => { j = 10; return j > i; };

            // what references does this lambda keep?
            d2 = x => x == j;

            Console.WriteLine("j = " + j + " result = " + d());
        }
    }

1 Ответ

2 голосов
/ 01 февраля 2012

Да, лямбда-выражения будут делать (и должны делать) то же самое, что и анонимные методы, когда дело доходит до захвата переменных. (Я предполагаю, что вы говорите о лямбда-выражениях, которые преобразуются в делегаты; если они преобразуются в деревья выражений, они могут немного отличаться - я не уверен.)

...