본문 바로가기

silverlight

Lambda Expressions in Silverlight #1

 안녕하세요. 오늘은 포스팅 할 주제는 C# 3.0의 언어적 특성인 부분이라서 Silverlight 뿐만 아니라, WPF든, WinForm이건 상관 없이 유용한 팁이 될 것 같습니다.

Variable Lifting
 제가 생각하는 람다식의 가장 큰 이점 중 하나는 바로, Variable Lifting 입니다.
 Variable Lifting 이란, 다음 코드와 같이 전역 변수가 아닌 블럭 내 지역 변수 임에도 람다식의 블럭에서도 사용이 가능한 것을 말합니다. 
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    int index = 0;

    this.TestButton.Click += (s, args) =>
    {
        index++;
        MessageBox.Show(index.ToString());
    };
}

 위 코드에서 int형 변수인 index는 MainPage_Loaded 함수의 블럭에 존재하는 지역 변수이지만, TestButton.Click 이벤트를 등록하는 람다식의 블럭에서도 사용이 가능합니다.

 어떻게 보면 그냥 당연하게 보일 수도 있는데요. 그럼 람다식이 아닌 형태로 코드를 타이핑 했다면 어떨까요?
Int32 index = 0;

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    this.TestButton.Click += new RoutedEventHandler(TestButton_Click);
}

void TestButton_Click(object sender, RoutedEventArgs e)
{
    this.index++;
    MessageBox.Show(this.index.ToString());
}


 보시는 바와 같이, index 변수를 전역으로 올려서 써야만 TestButton_Click 이벤트를 구현하는 부분에서 사용할 수 있습니다.

 이렇게 좋은 Variable Lifting 를 활용하다 보면, 람다식을 너무 많이 쓰게 됩니다. (특히, 이벤트의 구현 같은 부분에서 말이죠) 그러나, 너무 과하게 사용하다 보면 아니, "적재적소에 사용하지 않고 남발하게 되면" 뜻하지 않게 이벤트가 엉켜 있거나 등록이 중복 되어 구현부가 수 번 실행 되는 등의 문제가 발생하게 됩니다.

 위와 같은 문제가 일어나는 구체적인 예제는, #2에서 다시 포스팅 하겠습니다. (바로~)