C#由变量捕获引起对闭包的思考
偶尔翻翻书籍看看原理性的东西确实有点枯燥,之前有看到园中有位园友说到3-6年工作经验的人应该了解的.NET知识,其中就有一点是关于C#中的闭包,其实早之前在看书时(之前根本不知道C#中还有闭包这一说)看到对于闭包的内容篇幅很少而且介绍的例子一看就懂(最终也就是有个印象而已),反正工作又用不到来让你去实现闭包,于是乎自己心存侥幸心理,这两天心血来潮再次翻了翻书想仔细研究一番(或许是出于内心的惶恐吧,工作几年竟然不知道闭包,就算知道而且仅止于了解,你是在自欺欺人么),紧接着就查了下资料来研究研究这个东西,若有错误之处,请指出。
话题首先来我们来看看委托的演变进化史,有人问了,本节的主题不是【C#由变量捕获引起对闭包的思考】?哦,看的还仔细,是的,咱能别着急么,又有人问了,你之前不是写过有关委托的详细介绍么,哦,,看来还是我的粉丝知道的还挺多,但是这个介绍侧重点不同啦,废话少来,进入主题才是真理。
C#1.0之delegate我们今天知道过来一个列表可以通过lamda如where或者predicate来实现,而在C#1.0中我们必须来写一个方法来实现predicate的逻辑,紧接着创建委托实例是通过指定的方法名来创建。我们来创建一个帮助类(ListUtil),如下:
/// <summary> /// 操作list帮助类 /// </summary> static class ListUtil { /// <summary> /// 创建一个predicate /// </summary> public static IList<T> Filter<T>(IList<T> source, Predicate<T> predicate) { List<T> ret = new List<T>(); foreach (T item in source) { if (predicate(item)) { ret.Add(item); } } return ret; } /// <summary> ///遍历列表并在控制台上进行打印 /// </summary> public static void Dump<T>(IList<T> list) { foreach (T item in list) { Console.WriteLine(item); } Console.ReadKey(); } }
同时给出一个测试数据:
static class SampleData { public static readonly IList<string> Words = new List<string> { "the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" }.AsReadOnly(); }
现在我们要做的是返回其长度小等于4的字符串并打印,给出长度小于4的方法:
static bool MatchFourLettersOrFewer(string item) { return item.Length <= 4; }
下面我们在控制台调用上述方法来进行过滤:
Predicate<string> predicate = new Predicate<string>(MatchFourLettersOrFewer); IList<string> shortWords = ListUtil.Filter(SampleData.Words, predicate); ListUtil.Dump(shortWords);
结果打印如下:
上述一切都是so easy!当我们利用委托来实现时只是简单的进行一次调用不会多次用到,为了精简代码,此时匿名方法出现在C# 2.0.
C#2.0之delegate上述在控制台进行调用方法我们稍作修改即可达到同样效果,如下:
Predicate<string> predicate = delegate(string item) { return item.Length <= 4; }; IList<string> shortWords = ListUtil.Filter(SampleData.Words, predicate); ListUtil.Dump(shortWords);
好了,到了这里貌似有点浪费篇幅,到这里我们反观上述代码,对于predicate中过滤数据长度都是硬编码,缺少点什么,我们首先要讲的是闭包,那对于闭包需要的可以基本概括为:闭包是函数与其引用环境组合而成的实体(来源于:你必须知道的.NET)。我们可以将其理解为函数与上下文的综合。我们需要来通过手动输入过滤数据的长度来给出一个上下文。我们给出一个过滤长度的类(VariableLengthMather):
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/63055.html