new 키워드를 사용하여 이벤트에 대리인을 추가하는 것이 안전합니까?

StackOverflow https://stackoverflow.com/questions/99790

  •  01-07-2019
  •  | 
  •  

문제

제가 걱정하는 한 가지는 이벤트에 대리인을 등록하는 두 가지 방법을 발견했다는 것입니다.

  1. OnStuff += this.Handle;
  2. OnStuff += new StuffEventHandler(this.Handle);

첫 번째는 깨끗하고 "onstuff- = this.handle"을하는 것은 의미가 있습니다. 이벤트에서 등록하지 않기 위해 ...하지만 후자의 경우 "OnStuff -= new StuffEventHandler(this.Handle);"를 수행해야 합니까?다른 StuffEventHandler 참조를 삽입하고 있으므로 아무것도 제거하지 않는 것 같습니다.이벤트가 대리자를 참조로 비교합니까?여기서 불쾌한 메모리 풀을 시작할 수 있을지 걱정됩니다.날 잡아봐?이전에 등록한 "새 StuffEventHandler"에 대한 참조가 없습니다.

#1을 하면 어떤 단점이 있나요?

#2를 하면 어떤 이점이 있나요?

도움이 되었습니까?

해결책

원래 등록된 대리자에 대한 참조를 유지하는 것에 대해 걱정할 필요가 없으며 "불쾌한 메모리 풀"이 시작되지 않습니다.

"onstuff- = new stupeventhandler (this.handle);" 제거 코드가 있습니다 ~ 아니다 참조로 제거하려는 대리자를 비교하십시오.대리자가 호출할 대상 메서드에 대한 참조를 비교하여 동일한지 확인하고 "OnStuff"에서 일치하는 대리자를 제거합니다.

그런데 "OnStuff" 자체는 위임 개체입니다(선언에 있다고 가정하는 이벤트 키워드는 단순히 위임의 액세스 가능성을 제한합니다).

다른 팁

첫 번째는 두 번째 MSIL과 동일한 MSIL을 생성하는 약어입니다. 컴파일 유형에서는 this.Handle을 살펴보고 인스턴스화할 대리자를 유추합니다.하지만 new를 사용하여 구독을 취소해서는 안 됩니다.

따라서 두 가지 사이에는 차이가 없으며 코드를 더 깔끔하게 만들기 위한 약간의 구문 설탕만 있으면 됩니다.

나는 2가 단지 구문 설탕이라는 인상을 받았습니다.그들은 정확히 똑같은 것.

내가 올바르게 기억한다면 첫 번째 대안은 두 번째 대안에 대한 구문 설탕일 뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top