events - 从 C++/CLI 引发事件的正确方法?

标签 events c++-cli raise

我想知道从 C++/CLI 引发事件的正确方法是什么。在 C# 中 hould first make a copy of the handler, check if it's not null, and then call it . C++/CLI 是否有类似的做法?

最佳答案

这不是故事的全部!您通常不必担心 C++/CLI 中的空事件处理程序。这些检查的代码是为您生成的。考虑以下简单的 C++/CLI 类。

public ref class MyClass
{
public:
    event System::EventHandler ^ MyEvent;
};

如果你编译这个类,并使用 Reflector 反汇编它,您将获得以下 c# 代码。
public class MyClass
{
    // Fields
    private EventHandler <backing_store>MyEvent;

    // Events
    public event EventHandler MyEvent
    {
        [MethodImpl(MethodImplOptions.Synchronized)] add
        {
            this.<backing_store>MyEvent = (EventHandler) Delegate.Combine(this.<backing_store>MyEvent, value);
        }
        [MethodImpl(MethodImplOptions.Synchronized)] remove
        {
            this.<backing_store>MyEvent = (EventHandler) Delegate.Remove(this.<backing_store>MyEvent, value);
        }
        raise
        {
            EventHandler <tmp> = null;
            <tmp> = this.<backing_store>MyEvent;
            if (<tmp> != null)
            {
                <tmp>(value0, value1);
            }
        }
    }
}

通常的检查是在 raise 方法中完成的。除非你真的想要自定义行为,否则你应该像在上面的类中一样声明你的事件,并在不担心空处理程序的情况下引发它。

关于events - 从 C++/CLI 引发事件的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/462805/

相关文章:

visual-c++ - C++ 中的字符串 ^ 声明

c# - 如何在 C++/CLI 中将属性添加到返回值?

wpf - 引发 WPF MouseLeftButtonDownEvent 事件

javascript - 如何通过 D3 单击事件让 $rootScope.$emit() 和 ng-show 协同工作?

Java - 在后台线程中处理计时器事件

visual-studio-2010 - No_CLR_Support 具有 C++/CLI 源文件的 C++ 项目

python - 如何使用 pytest 确认引发正确的异常

c - ruby的rb_raise如何停止调用它的c函数的执行?

jquery - e.preventDefault 不起作用 — jquery

reactjs - 为什么复选框事件处理程序中的 `MouseEvent` 不是通用的?