IT Share you

인라인 이벤트 핸들러를 작성하는 것이 나쁜 습관입니까?

shareyou 2020. 12. 12. 12:40
반응형

인라인 이벤트 핸들러를 작성하는 것이 나쁜 습관입니까?


인라인 이벤트 핸들러를 작성하는 것이 나쁜 습관입니까?

저에게는 다음과 같이 이벤트 핸들러에서 지역 변수를 사용하고 싶을 때 사용하는 것이 좋습니다.

나는 이것을 선호한다 :

// This is just a sample
private void Foo()
{
    Timer timer = new Timer() { Interval = 1000 };
    int counter = 0; // counter has just this mission
    timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
    timer.Start();
}

대신 :

int counter = 0; // No need for this out of Boo & the event handler

private void Boo()
{
    Timer timer = new Timer() { Interval = 1000 };

    timer.Tick += timer_Tick;
    timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    myTextBox.Text = (counter++).ToString();
}

두 가지주의 사항이 있지만 절대적으로 괜찮습니다.

  • 클로저 내에서 로컬 변수를 수정하는 경우 수행중인 작업을 이해하고 있는지 확인해야합니다.
  • 이벤트 구독을 취소 할 수 없습니다.

일반적으로 저는 정말 간단한 이벤트 핸들러 만 인라인 합니다. 더 많은 관련이있는 경우에는 람다 식 (또는 익명 메서드)을 사용하여 더 적절한 메서드가있는 메서드 호출을 구독합니다.

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };

대부분의 경우 "timer_Tick ()"과 같은 별도의 메서드를 사용하는 것이 좋지만 OnTimerTick ()을 다음과 같이 호출해야합니다.

  • 수업을 읽으면 밀이 더 명확 해집니다. "On"은 캔 이벤트 핸들러를 알려줍니다.
  • "인라인"사례에서 메서드에 중단 점을 설정하는 것이 더 쉽습니다.
  • 이 행사는 "Foo"계약자가 돌아온 지 오래되고, 계약자의 범위에서 실행되는 것으로 생각하지 않습니다.

그러나 이벤트가 인라인으로 선언 된 메서드가 반환되기 전에 만 발생하고 이벤트가 설정된 개체에 선언 메서드로 제한되는 범위가있는 경우 "인라인"버전이 더 좋다고 생각합니다. 따라서 저는 "정렬"메서드에 전달되는 비교 대리자에 대해 "인라인"을 사용하는 것을 좋아합니다.


두 개의 샘플을 함께 넣습니다. 두 번째 옵션 (당신이 선호하지 않는)이 가장 읽기 쉽다는 것은 분명합니다.

코드 가독성과 유지 관리가 매우 중요합니다. 가능한 한 이해하기 쉽게 단순하게 유지하십시오. 람다 식은 일반적으로 대부분의 사람들이 이해하기 어려운 것으로 간주됩니다. 비록 그들이 다른 사람들에게 당신을위한 제 2의 본성 일지라도 그렇지 않을 수도 있습니다.

참고 URL : https://stackoverflow.com/questions/4063753/is-it-bad-practice-to-write-inline-event-handlers

반응형