본문 바로가기

C#/MSIL

[MSIL] 람다식의 캡쳐 구현하기

쓰다말음


위의 경우처럼 함수의 인자를 줄이기 위해서 람다식을 사용하는 경우가 있다.
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