1

我正在用 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 方法并且它们受到保护。有什么方法可以防止这种情况发生吗?

4

1 回答 1

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 方法公开为受保护的。暴露默认维护事件的底层委托字段将是危险的,并且不允许类在没有自动委托支持字段的情况下以自己的方式实现事件的灵活性。

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

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

18.2.2 为活动保留的成员名称

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

  • 添加_E
  • 删除_E
  • raise_E

所以这不是可以改变的

于 2009-02-24T14:37:52.533 回答