День сто тридцать четвёртый. #ЗаметкиНаПолях

Анонимные методы

Создание анонимных методов – это способ передать блок кода в качестве параметра делегата:

button1.Click += delegate(System.Object o, EventArgs e)

{ MessageBox.Show("Click!"); };



// Создание делегата

delegate void Del(int x);

// Инициализация делегата анонимным методом

Del d = delegate(int k) { /* … */ };

Анонимные методы упрощают создание экземпляров делегатов, т.к. не нужно создавать отдельный именованный метод. Это может быть полезно в ситуации, когда создание метода не требуется, например, при создании нового потока:

void StartThread()

{

Thread t1 = new Thread

(delegate()

{

Console.Write("Hello, ");

Console.WriteLine("World!");

});

t1.Start();

}



Замечания

- Область действия параметров анонимного метода - блок анонимного метода.

- Нельзя использовать операторы перехода (goto, break или continue) из анонимного метода во внешний код, либо наоборот.

- Анонимный метод не может получить доступ к параметрам in, ref или out внешней области определения.

- В пределах блока анонимного метода нельзя получить доступ к небезопасному коду.

- Анонимные методы не допускаются в левой части оператора is.

- Локальные переменные и параметры, определённые в той же области, что и анонимный метод, называются внешними переменными анонимного метода:

int n = 0;

Del d = Delegate() {System.Console.WriteLine ("Copy #: {0}", ++n); };

Ссылка на внешнюю переменную n захватывается при создании делегата. В отличие от локальных переменных, время жизни захваченной переменной увеличивается до тех пор, пока делегаты, ссылающиеся на анонимные методы, не будут подходить для сборки мусора.



Источник: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/anonymous-methods