Насколько я знаю, рейз мало используется, и я практически никогда не видел, чтобы он использовался. C ++ / 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.
Также ничего не стоит, так как C # позволяет вам вызывать событие исключительно в области действия типа, который объявляет событие-член, вы не можете получить код C # для вызова этого метода повышения. Так что нет, вы не найдете такого метода в BCL.
Что касается методов .other
, я никогда не видел ни одного прикрепленного к событию. И я только видел, как они использовались один раз для свойств , и ни книга «Внутри IL ассемблера», ни «Аннотированный стандарт CLI» не дает никакой информации о них. Но в основном они позволяют вам прикреплять методы к свойству или событию, чтобы связать их семантически. Они не являются ни addon
, ни removeon
, ни raise
методом, но они будут частью события, если язык должен это выразить. В то же время, единственный способ испустить его - использовать ilasm.