위의 두 가지 기능의 대리자, 이벤트 및 .NET 구현과 관련하여 스택 오버플로에 대한 몇 가지 좋은 질문을 보았습니다. 특히 한 가지 질문 인 "How do C# Events work behind the scenes?"은 몇 가지 미묘한 점을 잘 설명해주는 훌륭한 답을 제공했습니다. 당신은 필드와 같은 이벤트 이 ... 컴파일러는 동일한 유형 의 방법 및 개인 필드를 (생성 선언 할 때이벤트가 .NET에서 델리게이트로 구현되는 경우 .event IL 섹션의 요점은 무엇입니까?
:
위의 질문에 대한 답변은이 점을 만든다 대리자). 클래스 내에서 ElementAddedEvent를 참조 할 때 필드를 참조하고 있습니다. 클래스 밖에서, 당신은 필드를 참조하고
같은 질문 ("Field-like events")에서 연결된 MSDN 기사 추가 :
는 이벤트를 발생의 개념이 정확하게 상응하는입니다 이벤트에 의해 표현 된 대표단을 호출하기 위해 - 과 같이 이벤트를 발생시키는 특수 언어가 없습니다. . 추가 검사 싶은
, 나는 이벤트 및 대리자로 컴파일하는 IL를보기 위해 테스트 프로젝트를 구축 : 내가 기대
public class TestClass
{
public EventHandler handler;
public event EventHandler FooEvent;
public TestClass()
{ }
}
대리자 필드
handler
이벤트
FooEvent
에 컴파일러에서 생성 된
FooEvent
필드에 대한 액세스를 래핑하는 몇 가지 추가 메서드를 사용하여 거의 동일한 IL 코드로 컴파일하십시오. 그러나 IL 내가 기대했던 아주 아니었다 생성 :
.class public auto ansi beforefieldinit TestClass
extends [mscorlib]System.Object
{
.event [mscorlib]System.EventHandler FooEvent
{
.addon instance void TestClass::add_FooEvent(class [mscorlib]System.EventHandler)
.removeon instance void TestClass::remove_FooEvent(class [mscorlib]System.EventHandler)
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
// Constructor IL hidden
}
.field private class [mscorlib]System.EventHandler FooEvent
.field public class [mscorlib]System.EventHandler handler
}
이벤트가 컴파일러가 생성 add
및 remove
방법과 대표에 지나지 않기 때문에, 나는에서 그 이상 아무것도 처리 이벤트를 볼 기대하지 않았다 IL. 그러나 추가 및 제거 방법은 .event
으로 시작하는 절에서 정의되며, 일반적인 방법으로는 .method
이 아닙니다.
궁극적 인 질문 : 이벤트가 접근 자 메서드를 사용하는 대리자로 구현되는 경우 .event
일리노이 섹션의 요점은 무엇입니까? .method
섹션을 사용하여 이것없이 일리노이에서 구현할 수 없었습니까? .event
은 .method
과 같습니까? 나는 그 필드 대 속성에 대해 동일한 비교 ... 놀라운 확실하지 않다
당신이 일반적인 다른 구현에 대한 몇 가지 자세한 정보를 줄 수 있습니까? 난 당신이 다른 구현 구현에 대해 이야기하고 있다고 가정합니다. 다른 멤버가 아니라 다른 멤버가 아닌 다른 멤버를 대신 멤버로 필드를 사용하는 것입니다. – Chris
감사합니다. 대리자 필드 대신 EventHandlerList를 사용하여 구현 된 이벤트를지지 멤버로 지정하려면 어떻게해야합니까? 'event' 키워드의 기본 동작이 델리게이트 필드를 사용하는 것이라면 C#을 우회하여 직접 IL을 작성해야합니까? – Chris
나는 이미 위에 썼다. add */remove *를 지정하지 않은 경우 기본 *는 위임 필드를 사용하는 것입니다. 추가/제거를 지정하면 (위에서처럼) 원하는 것을 할 수 있습니다. 아마도 postsharp를 통해이 작업을 수행 할 수있을 것입니다,하지만 난 당신이 아마 일을 단순화하기 위해 IDE에서 "미리보기"를 사용할 수 –