【发布时间】:2010-09-14 00:03:40
【问题描述】:
这个显然不是看起来不是最佳实践。有人可以解释为什么这不是最佳实践或它是如何工作的吗?任何提供解释的书籍或文章将不胜感激。
//The constructor
public Page_Index() {
//create a local value
string currentValue = "This is the FIRST value";
//use the local variable in a delegate that fires later
this.Load += delegate(object sender, EventArgs e) {
Response.Write(currentValue);
};
//change it again
currentValue = "This is the MODIFIED value";
}
输出的值是第二个值“Modified”。编译器魔术的哪一部分使这项工作起作用?这就像跟踪堆上的值并稍后再次检索它一样简单吗?
[编辑]:给定一些cmets,把原句改一些……
【问题讨论】:
-
这种做法没有错。它只是比初学者理解的更高级。
-
借调;事实上,它可以实现非常干净/优雅的设计 - 但您确实需要了解其中的含义。
-
这真的很有趣。我不认为在分配委托的范围内弄乱局部变量是一种好习惯,但你总是会学到新的东西。
-
视场景而定;在大多数情况下,创建第二个范围紧密且永不更改的变量会是一个更好的主意 - 但是有一些更新捕获变量的用例,但确实:将它们视为只读,直到有一个好的原因,你的痛苦就会少得多。
-
这就是委托和闭包的区别。你在这里所做的是一个闭包。它们非常强大,而且我们在 .NET 中使用闭包这一事实是一个巨大的优势,而不是一个劣势。
标签: c# delegates closures heap-memory