Microsoft MVP성태의 닷넷 이야기
람다 캡처 관련 문의 [링크 복사], [링크+제목 복사],
조회: 12427
글쓴 사람
초보자
홈페이지
첨부 파일
 

안녕하세요.
좋은 사이트 운영해 주셔서 감사합니다.
람다 캡처 관련해서 문의 드리고자 합니다.
예시 코드는 아래와 같습니다.


========================================================


public class TestClass
{
    private int num = 0;

    public TestClass()
    {
        Action((int id) =>
        {
            num = 5;
        }, 0);
    }

    private void Action(Action<int> action, int id)
    {
        action(id);
    }
}

public class Program
{
    public static void Main()
    {
        new Program().Foo();
    }

    public void Foo()
    {
        var testClass = new TestClass();
    }
}


========================================================


제가 궁금한 점은 TestClass 생성자 부분에 람다 표현식이 있는데,
어떻게 람다 내부에서 TestClass의 private 맴버에 접근할 수 있는지가 궁금합니다.
(Foo 함수에서 TestClass 객체 생성 시 num이 5로 초기화 돼있더라고요.)
추측으로는 내부적으로 임시 클래스를 생성해서 TestClass의 래퍼런스를 저장할 거 같긴 한데 private 맴버는 어떻게 접근 가능한지는 잘 모르겠더라고요.
위 부분에 대해서 알려주시면 많은 도움이 될 거 같습니다.
감사합니다!








[최초 등록일: ]
[최종 수정일: 3/17/2022]


비밀번호

댓글 작성자
 



2022-03-17 08시31분
좋은 질문입니다. ^^

이런 경우, C# 컴파일러는 Action에 넘겨준 익명 메서드를 추출해서 (예를 들어) 다음과 같은 식으로 별도의 메서드로 분리합니다.

public class TestClass
{
    // ...[생략]...

    void myfunc(int id)
    {
        num = 5;
    }
}

그다음 생성자의 Action 호출 코드를 이렇게 바꾸는 것입니다.

public TestClass()
{
    Action(myfunc, 0);
}

이제 다시 보면... num 값을 접근할 수 있는 것이 당연하겠죠? ^^
정성태
2022-03-17 08시36분
[초보자] 아 그렇군요. 답변 감사드립니다!!
[guest]

... 76  77  78  79  80  81  82  83  84  85  [86]  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
326권인성2/23/200611236    답변글 [답변]: 한가지만 더 질문할게요.... [1]
323정보문2/21/200611649메일 내용에서 한글이 깨집니다. [1]파일 다운로드1
321셈토2/18/200611504SPOOL --> EMF --> TEXTOUT [1]
320정보문2/18/200611247파일의 최대 크기2 [1]
318정보문2/18/200612379파일의 최대 크기
319정성태2/18/200612464    답변글 [답변]: 파일의 최대 크기 [1]
317narc...2/17/200611557[IE embeded SmartClient]에서 닷넷 리모팅 프록시 사용시 처음 2분간 딜레이현상이 발생합니다. [1]
322narc...2/20/200612390    답변글 [답변]: 다시한번 부탁드리겠습니다..
316이경찬2/15/200613816MSDN 매거진 정기구독 신청은 어디서 할수있나요? [1]
315정준명2/15/200617234[DxFramework Lite] 분산 트랜잭션에 참여하는 동안 오류가 발생했습니다. [2]
314이윤희2/14/200611450엑셀변환시....그림을 넣을려면. [1]
313장강현2/14/200611656SmartClient 디버그 문제 [1]
312정보문2/13/200611655방법2006 [1]
309정보문2/10/200612801edit & continue [3]
308김용국2/11/200611266스마트클라이언트 관련질문 [ Client 에서 WebPage의 JavaScript 호출방법이 있을까요? 있다고는 한것 같은데..부탁드림^^
310정성태2/11/200610743    답변글 [답변]: 스마트클라이언트 관련질문 [ Client 에서 WebPage의 JavaScript 호출방법이 있을까요? 있다고는 한것 같은데..부탁드림^^
307narc...2/10/200612515IE Embeded 스마트클라이언트는 UserControl만 가능한가요? [2]
305정보문2/10/200612611웹 컨트롤
306정성태2/10/200612196    답변글 [답변]: 웹 컨트롤
303정보문2/10/200613141회원가입성공을 기념으로 질문 한 가지 던집니다.
304정성태2/10/200611546    답변글 [답변]: 회원가입성공을 기념으로 질문 한 가지 던집니다.
302김성2/7/200612749C#이나 VB.NET 으로 만든 것을 SETUP 해서 배포하려고 하는데요.. [1]
301참깨2/3/200617012개체가 이 속성 또는 메소드를 지원하지 않습니다. [1]
300김종욱2/2/200611366안녕하세요 [2]
299꼬부기1/19/200610539스마트클라이언트 관련 질문입니다... [2]
298정말초짜1/12/200610811smart client 질문입니다. [1]
... 76  77  78  79  80  81  82  83  84  85  [86]  87  88  89  90  ...