Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events C++/CLI为事件生成外观难看的raise\u XXX方法_Events_C++ Cli - Fatal编程技术网

Events C++/CLI为事件生成外观难看的raise\u XXX方法

Events C++/CLI为事件生成外观难看的raise\u XXX方法,events,c++-cli,Events,C++ Cli,我正在用C++/CLI编写自定义事件(我几乎只关心添加/删除方法),如下所示: 生成raise_XXX方法和 他们受到保护。有什么办法吗 防止这种情况发生 请注意,这对于ECMA-372规范是正确的。c#4更改了编译器创建的事件机制框架,因此c++/CLI也可能会更改 因为事件是由生成相关脚手架的编译器处理的(或者允许您自己为它们构建脚手架),所以必然会生成一组方法来完成这一任务 C++/CLI与大多数其他.Net语言的不同之处在于,它的事件糖允许子类引发在基类上声明的事件 public

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

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

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

  • 加上
  • 移开
  • 提高

所以这不是一件可以改变的事情

非常好。谢谢你的详细回答。
    public ref class Class1
    {
    public:
        event EventHandler^ MyEvent;
    };

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

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