当前位置:  开发笔记 > 编程语言 > 正文

使用Delegates的局部变量

如何解决《使用Delegates的局部变量》经验,为你挑选了1个好方法。

显然不是看起来像它不会是一个最佳实践.有人可以解释为什么它不是最佳实践或如何工作?任何提供解释的书籍或文章将不胜感激.

//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";

}

输出的值是第二个值"已修改".编译器魔术的哪个部分使这个工作?这跟跟踪堆上的值并稍后再次检索它一样简单吗?

[编辑]:鉴于一些评论,改变原来的一些句子......



1> Marc Gravell..:

currentValue不再是局部变量:它是一个捕获的变量.这编译成如下:

class Foo {
  public string currentValue; // yes, it is a field

  public void SomeMethod(object sender, EventArgs e) {
    Response.Write(currentValue);
  }
}
...
public Page_Index() {
  Foo foo = new Foo();
  foo.currentValue = "This is the FIRST value";
  this.Load += foo.SomeMethod;

  foo.currentValue = "This is the MODIFIED value";
}

乔恩斯基特拥有的这一个很好的写了C#的深度,和一个独立的(而不是详细)讨论在这里.

请注意,变量currentValue现在位于堆上,而不是堆栈 - 这有很多含义,尤其是它现在可以被各种调用者使用.

这与java不同:在java 中捕获变量的.在C#中,捕获变量本身.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有