C ++ / CLI генерирует уродливые выглядящие методы yield_XXX для событий - PullRequest
1 голос
/ 12 февраля 2009

Я пишу свои пользовательские события в C ++ / CLI (мне в основном нужны только методы добавления / удаления):

    event EventHandler<XyzEventArgs^> ^Xyz
    {
        void add(EventHandler<XyzEventArgs^> ^handler);
        void remove(EventHandler<XyzEventArgs^> ^handler);
        void raise(Object ^sender, XyzEventArgs ^e);
    }

Все отлично работает, но когда я смотрю на Intellisense под C #, он показывает уродливый публичный метод rise_Xyz.

Есть идеи, как скрыть это, не делая мои мероприятия закрытыми?

Любая помощь с благодарностью.

EDIT:

Мне удалось ликвидировать общественность поднять методы, отметив их другой модификатор видимости (внутренний в моем случае). Это довольно много значит, что события не могут быть поднял из-за пределов класса. Я не против. Я заметил, однако, что даже простые события

public:
event EventHandler ^XXX;

сгенерировать методы lift_XXX и они защищены. Там в любом случае предотвратить это?

1 Ответ

3 голосов
/ 24 февраля 2009

обратите внимание, что это верно для спецификации ECMA-372. c # 4 изменяет механизм механизма событий, созданный компилятором, так что C ++ / CLI также могут изменить

Поскольку события обрабатываются компилятором , генерирующим соответствующий каркас (или позволяющим вам создать собственный каркас для них), по необходимости будет создан набор методов, сгенерированных для этого.

C ++ / CLI отличается от большинства других языков .Net тем, что его сахар событий позволяет подклассам вызывать события, объявленные в базовом классе.

    public ref class Class1
    {
    public:
        event EventHandler^ MyEvent;
    };

    public ref class Class2 : Class1
    {
    public:
        void Foo()
        {
            this->MyEvent(this, gcnew System::EventArgs());
        }
    };

Это прекрасно компилируется (и запускается). сравнить с c # эквивалентом

    public class Class1
    {
        public event EventHandler MyEvent;
    }

    public class Class2 : Class1
    {
        public void Foo()
        {
        base.MyEvent(this, new System::EventArgs());
        }
    }

который откажется компилировать высказывание:

Событие «Class1.MyEvent» может только появляются в левой части + = или - = (кроме случаев использования внутри типа 'Class1')

Для того, чтобы C ++ / CLI мог это сделать, он должен предоставить метод rise_Xxx как защищенный. Раскрытие нижележащего поля делегата, которое поддерживает событие по умолчанию, было бы опасно, а также не позволяло бы классу реализовывать события по-своему без автоматического поля поддержки делегата.

Если вы не хотите, чтобы подклассы могли это делать (или видеть), то создание внутреннего кода - это эффективное решение для кода, который находится вне сборки.

обратите внимание, что спецификация CLI C ++ определяет соглашение об именах для скаффолдинга событий

18.2.2 Имена участников, зарезервированные для событий

Для события E (§18.5) зарезервированы следующие имена:

  • add_E
  • remove_E
  • raise_E

Так что это не то, что можно изменить

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