обратите внимание, что это верно для спецификации ECMA-372. c # 4 изменяет механизм механизма событий, созданный компилятором, так что C ++ / CLI также могут изменить
Поскольку события обрабатываются компилятором , генерирующим соответствующий каркас (или позволяющим вам создать собственный каркас для них), по необходимости будет создан набор методов, сгенерированных для этого.
C ++ / CLI отличается от большинства других языков .Net тем, что его сахар событий позволяет подклассам вызывать события, объявленные в базовом классе.
public ref class Class1
{
public:
event EventHandler^ MyEvent;
};
public ref class Class2 : Class1
{
public:
void Foo()
{
this->MyEvent(this, gcnew System::EventArgs());
}
};
Это прекрасно компилируется (и запускается). сравнить с c # эквивалентом
public class Class1
{
public event EventHandler MyEvent;
}
public class Class2 : Class1
{
public void Foo()
{
base.MyEvent(this, new System::EventArgs());
}
}
который откажется компилировать высказывание:
Событие «Class1.MyEvent» может только
появляются в левой части + = или
- = (кроме случаев использования внутри типа 'Class1')
Для того, чтобы C ++ / CLI мог это сделать, он должен предоставить метод rise_Xxx как защищенный. Раскрытие нижележащего поля делегата, которое поддерживает событие по умолчанию, было бы опасно, а также не позволяло бы классу реализовывать события по-своему без автоматического поля поддержки делегата.
Если вы не хотите, чтобы подклассы могли это делать (или видеть), то создание внутреннего кода - это эффективное решение для кода, который находится вне сборки.
обратите внимание, что спецификация CLI C ++ определяет соглашение об именах для скаффолдинга событий
18.2.2 Имена участников, зарезервированные для событий
Для события E (§18.5) зарезервированы следующие имена:
Так что это не то, что можно изменить