【问题标题】:C++/CLI generates ugly-looking raise_XXX methods for eventsC++/CLI 为事件生成丑陋的 raise_XXX 方法
【发布时间】:2010-03-27 22:55:42
【问题描述】:

我正在用 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 方法和 他们受到保护。有没有什么办法 防止这种情况发生?

【问题讨论】:

    标签: events c++-cli


    【解决方案1】:

    请注意,这适用于 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 节),保留以下名称:

    • add_E
    • remove_E
    • raise_E

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

    【讨论】:

    • 非常好。感谢您的详细回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多