C ++ / CLI为事件生成丑陋的raise_XXX方法

时间:2009-02-12 19:31:17

标签: events c++-cli

我正在用C ++ / CLI编写我的自定义事件(我几乎只关心添加/删除方法):

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

一切都很好,但当我在C#下看Intellisense时,它会显示一个丑陋的公共raise_Xyz方法。

关于如何在不将我的活动设为私有的情况下隐藏这些内容的任何想法?

非常感谢任何帮助。

修改

  

我能够消灭公众   raise_Xyz方法通过标记它们   不同的可见性修饰符   (在我的情况下是内部的)。这漂亮   很多意味着事件不可能   从班级外面长出来的。   这对我来说没问题。我注意到了,   然而,即便是简单的事件

public:
event EventHandler ^XXX;
     

生成raise_XXX方法和   他们受到保护。有什么办法吗?   防止这种情况发生?

1 个答案:

答案 0 :(得分:3)

请注意,这适用于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执行此操作,必须将raise_Xxx方法公开为protected。默认情况下公开维护事件的底层委托字段将是危险的,并且不允许类的灵活性以自己的方式实现事件而没有自动委托支持字段。

如果您不希望子类能够执行此操作(或查看它),那么将其设置为内部是对于在程序集外部的代码的有效解决方案。

请注意,C ++ CLI规范定义了事件脚手架的命名约定

  

18.2.2为活动保留的会员名称

     

对于事件E(第18.5节),保留以下名称:

     
      
  • ADD_E
  •   
  • remove_E
  •   
  • raise_E
  •   

所以这不是可以改变的东西