쓰다말음
위의 경우처럼 함수의 인자를 줄이기 위해서 람다식을 사용하는 경우가 있다.
c++의 std::bind 같은 메소드가 제공되면 편하겠지만, C#은 그러한 메소드를 제공하지는 않는다. 정상적인 코드라면 그러한 메소드를 사용하는것보다 람다함수의 캡쳐를 쓰는게 훨씬 낫기 때문에.
하지만 런타임에 위 코드처럼 어떤 메소드의 인자를 줄이고 싶은 상황에서는 상당히 불편하다.
따라하기 위해서는 먼저 C# 컴파일러가 람다와 캡처를 어떻게 처리하는지를 알아야 할 필요가 있다. (보고 배끼기 위해서)
위와같은 코드를 디컴파일하면 아래와같은 IL 코드가 생성된다.
주목할 점은 캡처를 클래스 필드를 이용해서 수행한다는 점인데, 코드중 string message 부분이다.
실제 람다 본문인 b__0 에서는 ldfld를 이용해 필드에 접근한다.
이를 Emit 으로 따라한 코드
caller side
callee side
'C# > MSIL' 카테고리의 다른 글
CLR에서 돌아가는 언어를 뭔가를 만들어 보면서 (1) | 2015.11.17 |
---|---|
[MSIL] 런타임 property 구현하기 (1) | 2015.11.05 |
[MSIL] beforefieldinit (1) | 2015.11.02 |
[MSIL] for loop (1) | 2015.11.02 |