문제

이것 분명하지 않습니다 모범 사례가 아닌 것처럼 보입니다. 누군가가 왜 모범 사례가 아닌지 또는 이것이 어떻게 작동하는지 설명 할 수 있습니까? 설명을 제공하는 모든 책이나 기사에 감사드립니다.

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

}

출력 값은 두 번째 값입니다 "수정". 컴파일러 매직의 어떤 부분 이이 작업을 만들고 있습니까? 이것은 힙의 값을 추적하고 나중에 다시 검색하는 것만 큼 간단합니까?

편집] : 댓글 중 일부가 주어지면 원래 문장을 변경합니다 ...

도움이 되었습니까?

해결책

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

Jon Skeet은 이것에 대한 정말 좋은 글을 가지고 있습니다. C# 깊이, 및 별도의 (상세하지 않은) 토론 여기.

변수 current -value는 이제 스택이 아닌 힙에 있습니다. 이는 다양한 발신자가 사용할 수 있다는 많은 의미가 있습니다.

이것은 Java와 다릅니다 : Java에서 변수의 캡처됩니다. C#에서 변수 자체 포착됩니다.

다른 팁

더 많은 질문은 그것이 로컬 변수와 어떻게 작동하는지 [MG Edit : "ACK- 무시 ..."후에 추가되었다고 생각합니다.

그것이 핵심이야; 정말 그렇지 않습니다 로컬 변수는 더 이상 - 적어도 우리가 일반적으로 그것들을 어떻게 생각하는지 (스택 등에) 생각하는 방법이 아닙니다. 하나처럼 보이지만 그렇지 않습니다.

그리고 정보를 위해, "모범 사례가 아님" - 익명의 방법과 캡처 된 변수는 실제로 매우 강력한 도구입니다. 특히 이벤트 작업 할 때. 자유롭게 사용하십시오. 그러나이 경로를 따라 가면 Jon의 책을 집어 들어 실제로 일어나는 일을 이해하는 것이 좋습니다.

폐쇄/대의원 내에서 변수의 값을 캡처해야합니다. 그렇지 않으면 본 것처럼 수정할 수 있습니다.

변수 로컬 (내부)에 CurrentValue를 대의원에게 할당하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top