再论闭包

微创社(MCC) 2009-10-06 11:23:08
更正我长期以来似是而非的一个说法:
闭包使函数成为变量

更正:
闭包不是函数,只是行为和函数相似

说法A:认为闭包是函数(X)
说法B:认为闭包是函数和引用环境组成的整体(OK)

说明:
闭包只是在形式和表现上像函数,但实际上不是函数。
函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。
闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

老贴:《奇怪的局部变量》
http://topic.csdn.net/u/20090821/13/7c30e8cb-3d37-4d4f-9c11-0df1dd7be8f4.html

最佳参考:
《闭包的概念、形式与应用》
http://www.ibm.com/developerworks/cn/linux/l-cn-closure/index.html
...全文
206 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
moliu 2009-10-27
  • 打赏
  • 举报
回复
谈笑有鸿儒往来无白丁
微创社(MCC) 2009-10-06
  • 打赏
  • 举报
回复
@空军

你说的那本
《框架设计(第2版):CLR Via C#》
己借,可以帮你查了~~

借了三十多本C#书书,有的看了,呵~~

yilanwuyu123 2009-10-06
  • 打赏
  • 举报
回复
mark
wuyi8808 2009-10-06
  • 打赏
  • 举报
回复
up
wartim 2009-10-06
  • 打赏
  • 举报
回复
最佳参考:
《闭包的概念、形式与应用》
http://www.ibm.com/developerworks/cn/linux/l-cn-closure/index.html

第一个例子里给的类似于delphi里的函数的内部函数,c#不支持内部函数,
第二个例子里给的类似于c++里的函数指针,c#里可以用委托来实现,

一回事么
微创社(MCC) 2009-10-06
  • 打赏
  • 举报
回复
结论:
闭包不是函数,只是行为和函数相似。
不是所有被传递的函数都需要转化为闭包,只有引用环境可能发生变化的函数才需要这样做。
微创社(MCC) 2009-10-06
  • 打赏
  • 举报
回复
@wartim
给你找了个链接:
http://book.csdn.net/bookfiles/588/10058819223.shtml

补充一个:
支持闭包重要的条件:
[1]函数是一阶值;
[2]函数可以嵌套定义;
[3]可以捕获引用环境,并
[4]把引用环境和函数代码组成一个可调用的实体;
[5]允许定义匿名函数;
其中[1]是根本性的,其它可选,支持程度不同
微创社(MCC) 2009-10-06
  • 打赏
  • 举报
回复
@wartim

关于:c#不支持内部函数
从表面上看,c#的确不支持内部函数
但有三个特征,使C#不需要这个特性:
[1]C#支持内部类
[2]匿名(这个只能算是语法层面上的,一种表达形式)
[3]C#是基于类型的语言
你看一下,下述贴子的20楼,天行健给出的解答(编译器的实现有点小差别,比如用的是内部类)
http://topic.csdn.net/u/20090821/13/7c30e8cb-3d37-4d4f-9c11-0df1dd7be8f4.html
输入[1]+[2]+[3]--》[编译器的语法糖]--》闭包的实现
为啥要内部函数定义,无非是绑定环境,在C#的实现上,是绑定在类上的。
再次重申:
对象是附有行为的数据,而闭包是附有数据的行为。

关于:c#里可以用委托来实现
这个推荐一本书书
《C#和.NET实战:平台、语言与框架 》(也是一本好书)
14.12.4 委托与闭包 的章节,讲的还是蛮透彻的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧