Почему события с пользовательскими средствами доступа не могут быть запущены напрямую, как по умолчанию? - PullRequest
6 голосов
/ 20 августа 2011

Если я напишу что-то вроде приведенного ниже кода,

class MainClass
{
    static EventHandler _myEvent= delegate{};
    static event EventHandler MyEvent
    {
        add{_myEvent += value;}
        remove{_myEvent -= value;}
    }

    public static void Main (string[] args)
    {
        MyEvent(null,EventArgs.Empty);
    }
}

компилятор пожалуется: Ошибка CS0079: оператор MainClass.MyEvent' can only appear on the left hand side of + = 'или оператор `- ='.

Почему так странно, как это вообще существует?Если я не могу запустить событие напрямую, зачем мне вообще использовать такую ​​вещь?Это ошибка (я использую моно) или продуманный деликатный дизайн?Может ли кто-нибудь научить меня обоснованию этого?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

Вам нужно вызвать заявленного вручную делегата поддержки, чтобы вызвать событие: замените MyEvent(null, EventArgs.Empty) на _myEvent(null, EventArgs.Empty).Если вы подумаете об этом, пользовательский метод добавления / удаления может хранить делегатов где угодно, поэтому вы не можете извлекать и вызывать их так, как вы это написали ...

2 голосов
/ 20 августа 2011

Вы можете получить доступ только к событию в объявленном классе. За кулисами .NET создает частные переменные экземпляра для хранения делегата.

Компилятор фактически создает публичное событие и приватное поле. Вы можете получить доступ к полю непосредственно из того же класса или вложенных классов. Из внешних классов вам будет разрешено только подписаться / отписаться.

Большая информация от Джона Скита доступна здесь о том, почему это и как это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...