开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 闭包

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

未经允许不得转载:我爱分享网 » C# 闭包

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏