C#闭包教程定义了闭包并展示了如何使用它们。
闭包是一个匿名委托,它维护对块定义之外的自由变量的访问。方法执行完成后,它仍然可以引用变量。
var limit = 0; Predicate<int> greaterThan = e => e > limit;
我们有一个引用limit变量的匿名lambda表达式,甚至认为它没有在块中声明或作为参数传递。
C#闭包示例
下面是一个简单的闭包例子。
var c = CreateCounter();
Console.WriteLine(c());
Console.WriteLine(c());
Console.WriteLine(c());
Console.WriteLine(c());
Console.WriteLine(c());
Func<int> CreateCounter()
{
int c = 0;
return () => c = c + 1;
}
多次调用CreateCounter;每次调用后,都会保留状态(c的值)。
$ dotnet run 1 2 3 4 5
C#闭包示例二
在LINQ代码中经常使用闭包。
var vals = new int[] {-1, -2, 0, 1, 5, 3};
var limit = 0;
Func<int, bool> greaterThan = e => e > limit;
var res = vals.Where(greaterThan);
foreach (var e in res)
{
Console.WriteLine(e);
}
在示例中,我们定义了一个过滤器委托。谓词中使用的limit变量是在谓词定义之外定义的自由变量。
$ dotnet run 1 3 5
C#闭包示例三
我们在迭代器示例中使用闭包。
var words = new List<string> { "sky", "cloud", "rock", "war", "web" };
var it = CreateIterator(words);
string e;
while ((e = it()) != null)
{
Console.WriteLine(e);
}
Iterator<T> CreateIterator<T>(IList<T> data) where T : class
{
var i = 0;
return delegate { return (i < data.Count) ? data[i++] : null; };
}
public delegate T Iterator<T>() where T : class;
我们有一个通用迭代器。为了让迭代器工作,我们必须保留增量变量的状态。
在本文中,我们使用了C#中的闭包。
列出所有C#教程。
