3

我有一个类 Foo,它有一个公共事件 Bar。我需要清除对 Bar 的所有订阅。

在 C# 中,它就像(在 Foo 类中)一样简单:

public void RemoveSubscribers() { this.Bar = null; }

(另见这个问题)

如何在 C++/CLI 中执行此操作?我无法将 Bar 设置为 nullptr:编译器吐出错误

Usage requires 'Foo::Bar' to be a data member

我看过 Bar 的 RemoveAll 方法,但我不明白我应该提供什么作为参数......

编辑 1:为清楚起见, Bar 声明如下:

public ref class Foo
{
public:
    event MyEventHandler^ Bar;
};
4

1 回答 1

1

C++/CLI 甚至在类中也隐藏了底层的后备存储(委托),因此您不能简单地将其设置为nullptr. 因为你不能依赖默认事件实现,所以你必须自己做:

private: EventHandler^ _myEvent;

public: event EventHandler^ MyEvent 
{
    void add(EventHandler^ handler)
    {
        _myEvent += handler;
    }

    void remove(EventHandler^ handler) 
    {
        _myEvent -= handler;
    }
}

现在您可以简单地取消myEvent委托:

_myEvent = nullptr;

当然,这也会改变您调用它的方式(与 C# 相同,而不是 C++/CLI 短版):

EventHandler^ myEvent = _myEvent;
if (myEvent != nullptr)
    myEvent(this, e);
于 2013-11-04T14:21:13.360 回答