Ответ 1
Что касается внешнего контракта, то, это событие не имеет сеттера, только add
и remove
Методы - абоненты могут зарегистрироваться и разрегистрировать от события, и объект публикации решает, когда для вызова функции обратного вызова с помощью "повышение" события. Следовательно, идея "присвоения события" вообще не имеет смысла.
Однако, когда вы объявляете событие в классе, компилятор С# предоставляет вам то, что действительно является удобной функцией: когда вы не предоставляете свою собственную реализацию, она создает для вас приватное, поддерживающее поле для делегатов, наряду с соответствующими реализациями add/remove. Это позволяет вам "установить событие" (действительно поле поддержки) внутри класса, но не за его пределами. Чтобы понять это, рассмотрите:
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 };
}
}