C# Когда оправдан захват внешних переменных в анонимных методах?

129
10 января 2021, 00:50

В C# предусмотрен механизм захвата внешних переменных в анонимных методах. Приведу пример кода:

private delegate void AddOp(int num);
static void Main(string[] args)
{
    var result = 0;
    AddOp add = delegate(int num)
    {
        result += num;
    };
    add(4);
    add(6);
    add(10);
    Console.WriteLine($"result = {result}");
    Console.ReadKey();
}

Сам механизм захвата понятен, но я не могу найти ему реальное применение на практике. Можете привести примеры, когда это действительно оправдано?

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

private delegate void AddOp2(ref int src, int num);
static void Main(string[] args)
{
    var result = 0;
    AddOp2 add = delegate(ref int src, int num)
    {
        src += num;
    };
    add(ref result, 4);
    add(ref result, 6);
    add(ref result, 10);
    Console.WriteLine($"result = {result}");
    Console.ReadKey();
}

Для чего его придумали?

Answer 1

Например, ты создал анонимный метод и создал несколько Task'ов на его основе.

Так вот, в основном методе ты можешь объявить объект и использовать его внутри анонимного метода в качестве синхронизации:

var obj = new Object();
var task1 = System.Threading.Tasks.Task.Factory.StartNew(() => {
lock(obj){
}
})
var task2 = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    lock (obj)
    {
    }
})

Так же в LINQ это повсеместно используется.

Например, тебе нужно отобрать значения, которые равны определенной переменной:

var a=10;
list.Where(x=>x==a);

В этом случае не нужно делать каких-либо лишних телодвижений, компилятор сам сделает.

READ ALSO
Окрасить ячейки datagrid wpf

Окрасить ячейки datagrid wpf

имеется вот такая таблица Datagrid

136
Как не хардкодить пароли и учётки в коде?

Как не хардкодить пароли и учётки в коде?

Как не хардкодить учетные записи? Какие есть варианты решения данной проблемы?

109
Как сделать рейтинг в игре?

Как сделать рейтинг в игре?

Есть игра "Найди элементы на картинке" есть две разных картинки,где нужно искать элементы

127
Форматировать данные в Excel как таблицу

Форматировать данные в Excel как таблицу

Работаю с Excel на c#Задаю имена столбцов, вывожу данные

136