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#教程。