2010-05-03 4 views
0

조치 목록을 사용하여 객체에 실행 취소 기록을 저장하고 있습니다. 람다 보면클로저에서 속성 이름을 사용할 때 'this'를 포함해야합니까?

public class Class1 
{ 
    public Class1() 
    { 
    } 

    private readonly List<Action> m_undoActions = new List<Action>(); 

    private SomeObject myChildObject { get; set; } 

    public void ChangeState() 
    { 
     m_undoActions.Add(() => myChildObject.UndoChangeState()); 
     myChildObject.ChangeState(); 
    } 
} 

:이 전 myChildObject라는 내 개체의 속성을 가지고 있으며이 메소드 호출에 의해 변이되고, 그래서 나는 그에게 다시 변이 것입니다 실행 취소 작업을 저장하고 싶은 말은하자 현재 값입니다 표현식은 전달 된 myChildObject (객체)에 대한 참조이거나 전달 된 this에 대한 참조입니다. 머리말을 붙이려면 'this'를 사용해야합니까? 로컬 변수에 대한 'this'참조의 사본을 먼저 만들어야합니까?

폐쇄 자료에 대해 이해해 주셔서 감사합니다.

답변

3

아니요, 람다 외부에있는 멤버보다 람다 멤버를 인스턴스 멤버로 명시 적으로 지정할 필요가 없습니다.

+0

죄송합니다. 질문을 명확하게 변경했습니다. 나는 closure로 전달 된 것을 알아 내려고 노력하고있다 : 'this'에 대한 참조 또는 자식 객체 자체에 대한 참조? –

+0

당신이 지금 가지고있는 것은 진정한 폐쇄가 아닙니다. 이렇게하면 정적 메서드 대신 인스턴스 메서드가 만들어집니다. –

+0

사실 폐쇄가 필요하다면 다음과 같이 지역 변수를 만들 수 있습니까? var me = this; 그리고 나서 람다에서 me.myChildObject.UndoChangeState()를 호출 하시겠습니까? –

관련 문제