欢迎来到天天文库
浏览记录
ID:39465146
大小:76.50 KB
页数:19页
时间:2019-07-04
《Lambda应用设计模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Lambda应用设计模式在使用Lambda表达式时,我们常会碰到一些典型的应用场景,而从常用场景中抽取出来的应用方式可以描述为应用模式。这些模式可能不全是新的模式,有的参考自JavaScript的设计模式,但至少我看到了一些人为它们打上了名字标签。无论名字的好与坏,我还是决定给这些模式进行命名,至少这些名字很具有描述性。同时我也会给出这些模式的可用性、强大的部分和危险的部分。提前先说明:绝大多数模式是非常强大的,但有可能在代码中引入些潜在的Bug。所以,慎用。老生常谈了。事实上,在.NET的第一个版本中就已经支持回调模式了,但
2、形式有所不同。现在通过Lambda表达式中的闭包和局部变量捕获,这个功能变得越来越有趣了。现在我们的代码可以类似于:复制代码1voidCreateTextBox()2{3vartb=newTextBox();4tb.IsReadOnly=true;5tb.Text="Pleasewait...";6DoSomeStuff(()=>7{8tb.Text=string.Empty;9tb.IsReadOnly=false;10});11}1213voidDoSomeStuff(Actioncallback)14{15//Dosom
3、estuff-asynchronouswouldbehelpful...16callback();17}复制代码对于JavaScript开发人员,这个模式已经没什么新鲜的了。而且通常我们在大量的使用这种模式,因为其非常的有用。例如我们可以使用时间处理器作为参数来处理AJAX相关的事件等。在LINQ中,我们也使用了这个模式,例如LINQ中的Where会在每次迭代中回调查询函数。这些仅是些能够说明回调模式非常有用的简单的示例。在.NET中,通常推荐使用事件回调机制。原因有两点,一是已经提供了特殊的关键字和类型模式(有两个参数,一个
4、是发送者,一个数事件参数,而发送者通常是object类型,而事件参数通常从EventArgs继承),同时通过使用+=和-+操作符,也提供了调用多个方法的机会。函数作为返回值(ReturningFunctions)就像常见的函数一样,Lambda表达式可以返回一个函数指针(委托实例)。这就意味着我们能够使用一个Lambda表达式来创建并返回另一个Lambda表达式。这种行为在很多场景下都是非常有用的。我们先来看下面这个例子:复制代码1FuncSayMyName(stringlanguage)2{3s
5、witch(language.ToLower())4{5case"fr":6returnname=>7{8return"Jem'appelle"+name+".";9};10case"de":11returnname=>12{13return"MeinNameist"+name+".";14};15default:16returnname=>17{18return"Mynameis"+name+".";19};20}21}2223voidMain()24{25varlang="de";26//Getlanguage-e.g.b
6、ycurrentOSsettings27varsmn=SayMyName(lang);28varname=Console.ReadLine();29varsentence=smn(name);30Console.WriteLine(sentence);31}复制代码这段代码可以写的更简洁些。如果请求的语言类型未找到,我们可以直接抛出一个异常,以此来避免返回一个默认值。当然,出于演示的目的,这个例子展示了类似于一种函数工厂。另外一种方式是引入Hashtable,或者更好的Dictionary类型。复制代码1static
7、classTranslations2{3staticreadonlyDictionary>smnFunctions4=newDictionary>();56staticTranslations()7{8smnFunctions.Add("fr",name=>"Jem'appelle"+name+".");9smnFunctions.Add("de",name=>"MeinNameist"+name+".");10smnF
8、unctions.Add("en",name=>"Mynameis"+name+".");11}1213publicstaticFuncGetSayMyName(stringlanguage)14{15//Checkifthelanguageis
此文档下载收益归作者所有