В 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();
}
Для чего его придумали?
Например, ты создал анонимный метод и создал несколько 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);
В этом случае не нужно делать каких-либо лишних телодвижений, компилятор сам сделает.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как не хардкодить учетные записи? Какие есть варианты решения данной проблемы?
Есть игра "Найди элементы на картинке" есть две разных картинки,где нужно искать элементы
Работаю с Excel на c#Задаю имена столбцов, вывожу данные