Что касается внешнего контракта, событие не имеет установщика, только методы add
и remove
- подписчики могут регистрироваться и отменять регистрацию на событии, а объект публикации решает, когда вызывать обратные вызовы, «вызывая» событие.Следовательно, идея «назначить событие», вообще, бессмысленна.
Однако, когда вы объявляете событие в классе, компилятор C # предоставляет вам действительно удобную функцию: когда вы не предоставляете свою собственную реализацию, он создает private , резервное поле делегата для вас, вместе с соответствующими реализациями добавления / удаления.Это позволяет вам «установить событие» (действительно поле поддержки) внутри класса, но не за его пределами.Чтобы понять это, рассмотрим:
public class Foo
{
// implemented by compiler
public event EventHandler MyEvent;
public static Foo FooFactory(EventHandler myEventDefault)
{
// setting the "event" : perfectly legal
return new Foo { MyEvent = myEventDefault };
}
}
public class Bar
{
public static Foo FooFactory(EventHandler myEventDefault)
{
// meaningless: won't compile
return new Foo { MyEvent = myEventDefault };
}
}
public class Baz
{
// custom implementation
public event EventHandler MyEvent
{
add { } // you can imagine some complex implementation here
remove { } // and here
}
public static Baz BazFactory(EventHandler myEventDefault)
{
// also meaningless: won't compile
return new Baz { MyEvent = myEventDefault };
}
}