[英]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.