(из того, что я прочитал в Essential C # 4.0)
В основном, из этого кода C #:
public class CustomEventArgs: EventArgs {…}
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
public event CustomEventHandler RaiseCustomEvent;
компилятор сгенерирует код CIL (свободно), эквивалентный следующему коду C #:
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
private CustomEventHandler customEventHandler; // <-- generated by the compiler
public void add_CustomEventHandler(CustomEventHandler handler) {
System.Delegate.Combine(customEventHandler, handler);
}
public void remove_CustomEventHandler(CustomEventHandler handler) {
System.Delegate.Remove(customEventHandler, handler);
}
public event CustomEventHandler customEventHandler {
add { add_customEventHandler(value) }
remove { remove_customEventHandler(value) }
}
Когда вы копируете событие, вы фактически копируете private CustomEventHandler customEventHandler
. Поскольку делегат является неизменным, на копию не повлияет изменение оригинала customEventHandler
. Вы можете попробовать этот код, чтобы понять, что я имею в виду:
string s1 = "old";
string s2 = s1;
s1 = "new"; // s2 is still "old"
Еще одна важная характеристика, которую следует отметить о сгенерированном CIL
Код состоит в том, что CIL-эквивалент ключевого слова event
остается в CIL.
Другими словами, событие - это то, что код CIL распознает
явно; это не просто конструкция C #. Сохраняя эквивалент event
ключевое слово в коде CIL, все языки и редакторы могут предоставить
особая функциональность, потому что они могут распознать событие как особый
ученик.
Я полагаю, вы были сбиты с толку, главным образом, потому что вы думали, что событие - это синтаксис для класса, верно?