繁体   English   中英

用C ++ / CLI重写此行

[英]Rewrite this line in C++/CLI

我在C#中有这样的类和委托:

public delegate void Super();
public class Event
{
    public event Super activate ;
    public void act()
    {
       if (activate != null) 
           activate();
    }
}

我需要用C ++ / CLI重写它。 但是我有一个错误- usage requires Event::activate to be data member

public delegate void Super();
public ref class Event
{
    public:
        event Super ^activate;
        void act()
        {
            if (activate!=nullptr) 
                activate();
        }
};

activate()调用中有问题吗?

IIRC,在C ++ / CLI中,您不需要null测试,编译器会为您插入它。 刚打电话

activate();

MSDN确认:

下面的代码示例演示了用于生成琐碎事件的提高方法的逻辑:如果事件有一个或多个用户,调用raise方法或明或暗地调用委托。 如果委托的返回类型不为void并且事件订阅者为零,那么raise方法将返回委托类型的默认值。 如果没有事件订阅者,则只调用raise方法即可,并且不会引发异常。 如果委托返回类型不为void ,则返回委托类型。

这是一件非常好的事情,因为C#鼓励竞争条件(您发布的代码包含一个)。 C ++ / CLI编译器不会在空检查和调用之间重新读取后备字段,因此它是线程安全的,无需付出额外的努力。 与C ++ / CLI编译器生成的等效的C#版本是:

var activate_copy = activate;
if (activate_copy != null) 
    activate_copy();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM