看起来您正试图触发一个事件。
在 C# 中,有一个标准的习惯用法用于触发事件,同时防止空引用异常和多线程修改:
// C#
EventHandler handler = this.MyEvent;
if(handler != null)
handler(this, new EventArgs(foo));
看起来您正试图在 C++/CLI 中重新创建它,但这是不必要的。在 C++/CLI 中,一个事件将发出三个“内部方法”(这是它们的正确名称吗?),分别称为add
、remove
和raise
. 在 C# 中,它只创建add
并且remove
没有显式的 raise,这就是为什么我们必须一遍又一遍地编写该代码块的原因。
这是在 C++/CLI 中定义的事件,以及 .NET Reflector 在反编译时看到的内容:
// C++/CLI:
public ref class Test
{
public:
event EventHandler^ MyEvent;
};
// Decompiled to C#:
public class Test
{
// 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
方法正在为您进行空值检查,因此您可以跳过它,直接触发事件而不进行检查。
if(oldState != _state)
this->UnitStateChanged(this, gcnew UnitStateChangedEventArgs(oldState, _state));