InfoQ

新闻

使用Closures改善API的设计与使用

作者 Jonathan Allen译者 张逸 发布于 2008年9月16日 下午10时19分

社区
.NET
主题
编程
标签
C#,
函数式编程,
Visual Basic.NET,
闭包(Closures)

某些执行复杂解析的API通常会通过事件暴露中间结果。例如,XDocument.Validate扩展方法使用了一个事件来通知程序存在的验证错误。

在传统的.NET编程中,捕获这些事件就意味着需要为每个事件创建一个单独的函数。由于没有直接的途径传递事件处理器的额外信息,通常这些函数会在抛出事件的类中来实现。

Eric White使用Closures演示了一种更好的方式。Closures在lambda或匿名内联函数中,属于一种特殊情形。其特殊之处在于能够引用一种变量,这种变量并非直接赋值,而是赋给包含了lambda的函数。这就使得Eric可以将事件处理器的逻辑赋值给函数。如下的代码行演示了创建Closure,并将其传递给Validate函数的方法:

snippet.Validate(schemas, (o, e) => errors += e.Message + Environment.NewLine);

正如在批注中所示,C#和VB中的Closure均被实现为匿名类,它包含了必要的成员变量。“被装入”的变量被移到新类中,既可通过原有函数,也可以通过包含它的任意匿名函数所引用。

查看英文原文:Using Closures to Improve API Design and Usage

Faisal Waris的精彩评论:

如果使用Closures,则程序的某些部分会变得更为简洁。正如在一些旧有语言中开一时风气之先的语言那样(LISP、Smalltalk等),大多数新的主流语言都支持Closures(VB、C#、Ruby、Python、javascript)。Java是一个值得注意的例外[译注:在Java 7中引入了对Closures的支持]。然而并非所有人(特别是C#/VB社区)都对此有所了解,或者欣然接受,因而对其给与更多的关注总是一件好事。值得注意的是,异步编程从Closures中获益良多——最显而易见的证据就是AJAX对其的广泛使用。Closures在DLR中的支持,对Silverlight编程无疑起到了推波助澜的作用,因为所有的服务端调用都是在调用体之外进行异步处理的。

1 条回复

回复

标题太大 发表人 jun wan 发表于 2008年10月30日 上午1时44分
  1. 返回顶部

    标题太大

    2008年10月30日 上午1时44分 发表人 jun wan

    标题有些大了,总感觉这个使用C#的lambda来改善事件或委托的写法,和API不是很紧扣吧!

独家内容

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。

揭示常见的重构误区

相对于Java,.NET在持续重构方面所给与的重视仍然少为人知,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Danijel Arsenovski试图为你揭示这些谜题。