Ответ 1
Насколько я знаю, рейз не используется много, и я его почти никогда не видел. С++/CLI - это в значительной степени единственный язык, который я знаю, что упрощает объявление метода повышения. См. Этот код, например:
using namespace System;
ref class Foo {
private:
Action ^bar;
public:
event Action ^Bar {
void add (Action ^action)
{
Console::WriteLine ("add");
bar += action;
}
void remove (Action ^action)
{
Console::WriteLine ("remove");
bar -= action;
}
void raise ()
{
Console::WriteLine ("raise");
if (!bar)
return;
Console::WriteLine ("raise for real");
bar->Invoke ();
}
};
};
void hello ()
{
Console::WriteLine ("hello");
}
void main ()
{
Foo ^foo = gcnew Foo ();
foo->Bar ();
foo->Bar += gcnew Action (&hello);
foo->Bar ();
}
Что, при запуске, естественно выдает:
C:\tmp>test
raise
add
raise
raise for real
hello
Чтобы ответить на ваш вопрос, нет кода операции для вызова события, компилятор просто испустит вызов метода повышения:
IL_0020: ldloc.0
IL_0021: call instance void Foo::raise_Bar()
Так же, как он испускает вызов add_Bar.
Также ничего не стоит, поскольку С# позволяет вызывать событие исключительно в области типа, объявляющего событие-член, вы не можете получить код С# для вызова этого метода raise. Таким образом, нет, вы не найдете такой метод, открытый в BCL.
Что касается методов .other
, я никогда не видел привязанных к событию. И я только видел, что они использовались один раз для свойств, и ни одна книга "Inside IL assembler", ни "Аннотированный стандарт CLI" не дают никакой информации о них. Но в основном они позволяют прикрепить методы к свойству или к событию, чтобы связать их семантически. Они не являются ни addon
, ни removeon
, ни методом raise
, но они будут частью события, если язык должен это выразить. Тем временем единственный способ испускать один - использовать ilasm.