2012-04-10 4 views
1

사용자 지정 단추 (Winforms 컨트롤 라이브러리)를 만들고 아래 코드를 사용하여 모든 단추가 모든 단추에 추가되도록합니다. 그것을 실행할 때 스택 오버플로 예외가 발생합니다. MouseEnter 대신 Click과 동일한 코드가 있는데 제대로 작동합니다. 여기내 이벤트 속성 코드로 인해 스택 오버플로 예외가 발생하는 이유는 무엇입니까?

public new event EventHandler MouseEnter { 
    add 
    { 
     this.MouseEnter += value; 
     foreach (Control i in Controls) 
     { 
      i.MouseEnter += value; 
     } 
    } 
    remove 
    { 
     this.MouseEnter -= value; 
     foreach (Control i in Controls) 
     { 
      i.MouseEnter -= value; 
     } 
    } 
} 

클릭 코드 : 여기에 코드입니다 ".이 이벤트에 대한 가산을 호출"

public new event EventHandler Click { 
    add { 
     this.Click += value; 
     foreach (Control i in Controls) { 
      i.Click += value; 
     } 
    } 
    remove { 
     this.Click -= value; 
     foreach (Control i in Controls) { 
      i.Click -= value; 
     } 
    } 
} 

답변

0

나는 이것을 대체했다. 기본 클릭. 클릭.

public new event EventHandler Click { 
     add { 
      base.Click += value; 
      foreach (Control i in Controls) { 
       i.Click += value; 
      } 
     } 
     remove { 
      base.Click -= value; 
      foreach (Control i in Controls) { 
       i.Click -= value; 
      } 
     } 
    } 
+1

이것은 'Click'의 기본 버전 만 올린 경우에만 작동한다. 당신의 버전의'Click'은 핸들러의 서브 스크립 션을 컨트롤의 자식에게 전달하는 * 도우미 메소드가되었습니다. * ** 이벤트 덧셈기 뒤에이 로직을 숨기지 말고 명확하게 명명 된 주석 처리 된 도우미 메소드를 작성하십시오 . ** – dlev

5

+=가 속기입니다 귀하의 덧셈기에서 +=으로 전화하고 있습니다. 따라서 언 바운드 재귀가 발생하여 스택 오버플로가 발생합니다.

코드를 보면 컨트롤에서 핸들러를 추가 및 제거하기 위해 가산기를 직접 정의하는 것처럼 보입니다. 이것은 상당히 나쁜 생각으로 나에게 충격을 준다. 주어진 이벤트에 대한 가입자는 실제 이벤트가 발동 될 때만 통지를받을 것이고 아무 것도 알지 못하는 수의 게시자에 의해 이벤트가 해고 될 때마다 통지되는 것이 아니라는 합리적 기대를 갖는다.

이렇게하는 도우미 메서드를 만들려면 메서드를 호출하는 소비자가 들어오는 요소를 정확히 알고 있기 때문에 더 이해할 수 있습니다. 또한 재귀 버그를 제거하여 부팅 할 수 있습니다.

마지막으로,이 기능은 아마도 불필요 할 것입니다. 어쨌든 많은 사건들이 아이들로부터 부모에게 거품을 일으킬 것입니다.

private EventHandler mouseEnter; 
public new event EventHandler MouseEnter { 
add 
{ 
    this.mouseEnter += value; 
    foreach (Control i in Controls) 
    { 
     i.mouseEnter += value; 
    } 
} 
remove 
{ 
    this.mouseEnter -= value; 
    foreach (Control i in Controls) 
    { 
     i.mouseEnter -= value; 
    } 
} 

}

당신은이 this.MouseEnter 재귀 자체를 호출 :

+0

내가 알기는하지만 내 클릭 코드가 작동하는 이유는 무엇입니까? MouseEnter가 마우스 클릭으로 대체되는 이유는 무엇입니까? – Oztaco

+0

코드 this.MouseEnter + = value; 다른 이벤트 처리기가 MouseEnter에 추가됩니다. 클릭 수보다 스택 오버 플로우가 더 빨리 발생하는 이유는 마우스를 움직일 때마다이 코드가 호출되기 때문입니다. –

+0

@ leaf68 Click 이벤트에 대한 코드를 붙여 넣을 수 있습니까? 그것은 꽤 이상합니다. – dlev

0

나는 당신이 (개인 회원에 대한 권리가 있는지 확실하지 않습니다) 같은 것을 원했다 생각합니다.

관련 문제