2014-01-21 4 views
8

우리는 이벤트와 클래스 선언이 고려 : 이벤트의 "공공성"의에도 불구하고공개 이벤트를 외부에서 직접 호출 할 수없는 이유는 무엇입니까?

public class FooBar 
{ 
    public event EventHandler FooBarEvent; 
} 

, 우리는 외부에서 FooBarEvent.Invoke를 호출 할 수 없습니다.

는 다음과 같은 방법으로 클래스를 modyfing에 의해 극복된다

public class FooBar 
{ 
    public event EventHandler FooBarEvent; 

    public void RaiseFooBarEvent(object sender, EventArgs eventArguments) 
    { 
     FooBarEvent.Invoke(sender, eventArguments); 
    } 
} 

외부 추가 만 청취자를 제거하여 제한 공개 이벤트를 액세스하는 이유는 무엇입니까?

+0

+1, [Observer pattern] (http://en.wikipedia.org/wiki/Observer_pattern) *은 공개'notifyObservers' 메소드를 가지고 있으므로 좋은 질문입니다. – Heinzi

답변

5

이벤트를 정의하면 소비자는 구독하고 탈퇴 할 수 있습니다. 이벤트를 발생시키는 기능은 이벤트를 선언하는 유형 계층 구조로 제한됩니다.

모든 구독자가 이벤트를 제기 할 수 있도록 허용하는 것은 다소 혼란 스럽습니다. 예를 들어 Focused 이벤트가 발생한 TextBox 클래스를 상상해보십시오. 낡은 소비자가 이벤트를 제기 할 수 있다면 Focused 이벤트는 실제로 TextBox 클래스에 집중되지 않을 때 쉽게 시작될 수 있습니다. 이렇게하면 이벤트 중에 어떤 유형의 불변성도 유지하는 것이 거의 불가능합니다.

+2

'... 조금 혼란 스럽다 ...'달의 삼가면서 말하는 – Alex

1

나는 이벤트가 어떻게 작동하는지에 대한 관점을 바꾸어야한다고 생각합니다. 다른 클래스는 이벤트를 소유하고 트리거해서는 안됩니다. 이 이벤트가 발생했을 때 이벤트를 "구독"하고 특정 작업을 수행하여 이벤트를 "수신 대기"하는 클래스.

2

그게 바로 사건입니다. 당신이 공개적으로 호출 할 경우, 당신은 아마

  1. 그것은 아무것도 할당에서 다른 클래스를 방지 delegates하지 events

    이벤트 캡슐화를 제공해야합니다

  2. 그것은 방법
  3. 에 매개 변수로 전달 방지
  4. 어떤 변수에도 할당 할 수 없도록합니다.
  5. 다른 클래스에서 호출하는 것을 방지합니다. 파생 클래스도 액세스 할 수 없습니다.

public 접근성이 어디하지 어디에서를 호출에서 가입 할 수 있다는 것을 알려줍니다.

3

개인적으로 이것은 전체 이벤트 아키텍처의 배경에 디자인 원칙을 올바르게 전달하기 위해 수행 된 것입니다.

이벤트의 목적은 주어진 오브젝트에서 발생하는 해당 이벤트의 리스너에게 통지하는 것입니다.

당신에게 속하지 않는 클래스의 이벤트를 발생시키는 포인트는 무엇입니까?

0

이것이 언어 정의 방법입니다. 이벤트는 소유 클래스에서만 해고 될 수 있습니다. 다른 클래스에서이 클래스를 실행해야하는 경우 소유 클래스에서 이벤트를 발생시키는 public 메서드를 정의하게하십시오.

public FireFooBarEvent (object sender, EventArgs args) 
{ 
    if(FooBarEvent != null) 
     FooBarEvent(sender, args); 
} 

모든 클래스에서이 메서드를 호출하십시오.

1

질문에 answer

C#에서 이벤트는 몇 가지 흥미로운 것은 객체에 발생하면 클래스가 그 클래스의 클라이언트에 알림을 제공 할 수있는 방법입니다.

외부에서 이벤트를 호출하는 것은 의미가 없으므로 허용되지 않습니다.