c#闭包以及foreach中的闭包;
时间: 2023-07-26 20:13:28 浏览: 213
C# 中闭包(Closure)详解
C#中的闭包是指一个函数能够访问它外部的变量,即使这些变量在函数外部定义。闭包可以在函数内部创建,也可以作为函数的返回值返回。
下面是一个简单的闭包示例:
```
public Func<int, int> Add(int a)
{
return b => a + b;
}
// 调用
Func<int, int> add5 = Add(5);
int result = add5(3); // result = 8
```
在上面的代码中,Add方法返回一个匿名函数,这个匿名函数能够访问Add方法中的变量a。当我们调用Add(5)时,会返回一个函数,这个函数会将传入的参数b加上a,然后返回结果。
关于foreach中的闭包,需要注意的是,foreach循环变量会在每次迭代中重新赋值,因此如果在循环体内部使用匿名函数访问循环变量,可能会导致意外的结果。例如:
```
List<Func<int>> funcs = new List<Func<int>>();
int[] nums = { 1, 2, 3 };
foreach (int num in nums)
{
funcs.Add(() => num);
}
foreach (Func<int> func in funcs)
{
Console.WriteLine(func());
}
```
上面的代码中,我们在第一个foreach循环中向一个List中添加了三个匿名函数,这些匿名函数都返回循环变量num。在第二个foreach循环中,我们依次调用了这三个函数,期望的结果是输出1、2、3。但实际上,输出的结果都是3,这是因为在第一个foreach循环中,循环变量num在每次迭代中都被重新赋值,而匿名函数中访问的是循环变量的引用,最终所有的函数都返回了最后一次迭代中的值3。
为了避免这种问题,我们可以在循环体内部创建一个局部变量来保存循环变量的值,然后在匿名函数中访问这个局部变量,例如:
```
List<Func<int>> funcs = new List<Func<int>>();
int[] nums = { 1, 2, 3 };
foreach (int num in nums)
{
int temp = num;
funcs.Add(() => temp);
}
foreach (Func<int> func in funcs)
{
Console.WriteLine(func());
}
```
这样就可以输出期望的结果了。
阅读全文