![]() |
1
9
C和JavaScript,以及O'Caml和Haskell,以及许多其他语言,都有所谓的 词法闭包 . 这意味着内部函数可以访问 姓名 封闭函数中的局部变量,而不仅仅是 价值观 . 当然,在具有不可变符号的语言中,例如O'caml或haskell,结束语名称与结束语值相同,因此这两种类型的结束语之间的差异消失了;然而,这些语言具有词汇结束语,就像c和javascript。 |
![]() |
2
3
并非所有闭包的行为都相同。有 differences in semantics . 注意,提出的第一个想法与C的行为相匹配…闭包语义的概念可能不是最主要的概念。 至于原因:我认为这里的关键是ECMA,一个标准组织。在本例中,微软只是遵循它们的语义。 |
![]() |
3
2
这实际上是一个很棒的功能。这样,您就有了一个访问通常隐藏的某个东西的闭包,比如说一个私有类变量,并让它以一种受控的方式对它进行操作,作为对类似事件的响应。 通过创建变量的本地副本并使用该副本,可以非常容易地模拟所需的内容。 |
![]() |
4
1
您还必须记住,在C中,实际上没有不可变类型的概念。因为.NET框架中的所有对象都不会被复制(必须显式实现icloneable等),所以即使在闭包中复制了“指针”foo,此代码也会打印“再见”:
因此,如果在目前的行为中更容易产生意想不到的后果,这是值得怀疑的。 |
![]() |
5
0
当您创建一个闭包时,编译器为您创建一个类型,该类型为每个捕获的变量都有成员。在您的示例中,编译器将生成如下内容:
为委托提供了对该类型的引用,以便它以后可以使用捕获的变量。不幸的是,本地实例
正如你所看到的
请原谅这种笨拙的语法,但其目的是表示
这将以某种方式提供您想要的,但需要对编译器进行更新。 |
![]() |
6
0
关于 为什么? C语言中的闭包是可变的,你必须问,“你想要简单化(Java),还是要有复杂度的电源(C**)?” 可变闭包允许您定义一次并重用。例子:
如果您不想定义一次并重用,因为您担心意外的结果,您可以简单地使用 复印件 变量。更改上述代码如下:
现在查询将返回相同的结果,不管
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |