Programming and my thoughts

개인적으로 어떤 언어의 기능이 궁금한 경우는.. 최대한 공식 문서를 먼저 찾아보는 편이다.


프로토콜의 경우 프로토콜 정의서...(스펙 문서)

클래스의 경우 클래스 정의서...


https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/add


위가 공식 문서 !


You do not typically need to provide your own custom event accessors. The accessors that are automatically generated by the compiler when you declare an event are sufficient for most scenarios.


EventHandler 의 add, remove 는 마치 property 의 get, set 처럼 동작하는 데...

접근자를 지정하지 않아도 기본적으로 add, remove 접근자가 구현되어 있다. 즉, 특별한 경우가 아니면 쓸 일이 없다.


https://stackoverflow.com/questions/2923952/explicit-event-add-remove-misunderstood


위 스택오버플로우 글도 참고하자.


1
2
3
4
5
6
7
8
9
10
11
12
13
public class Foo  
  private EventHandler handler; 
  public event EventHandler Event1 
  { 
    add { handler += value; } 
    remove { handler -= value; } 
  } 
 
// 아래 Event2 의 이벤트 subscribe 방식은 위와 동일하다.
// 즉... 머 add, remove 안써도 위와 동일하다는 이야기.
  public event EventHandler Event2;  
}
cs


아래와 같은 상황에서 add, remove 접근자를 사용할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
private EventHandler _explicitEvent;
public event EventHandler ExplicitEvent 
{
   add 
   { 
       if (_explicitEvent == null) timer.Start(); // 1.
       _explicitEvent += value; 
   } 
   remove 
   { 
      _explicitEvent -= value; 
      if (_explicitEvent == null) timer.Stop(); // 2.
   }
}
cs


1. ExplicitEvent 에 어떤 이벤트를 += 하여 subscribe 함과 동시에 timer.start() 이 호출된다.

2. ExplicitEvent 에 연결된 모든 이벤트가 -= 로 unsubscribe 됨과 동시에 timer.stop() 이 호출된다.


재미난 기능이긴 한데... 실제 개발하면서 많은 이벤트 핸들러를 다뤄보았지만... 쓰지는 않았다 ㅎㅎ