イベントを発生させようとしているようです。
C# には、null 参照例外とマルチスレッド変更から保護しながらイベントを発生させるための標準的なイディオムがあります。
// C#
EventHandler handler = this.MyEvent;
if(handler != null)
handler(this, new EventArgs(foo));
C++/CLI でそれを再作成しようとしているようですが、不要です。C++/CLI では、イベントはadd
、remove
、 と呼ばれる 3 つの「内部メソッド」 (それが適切な名前ですか?) を発行しますraise
。C# では、明示的なレイズを作成するだけで、明示的な昇格はありません。そのため、そのコード ブロックを何度も記述しなければなりませんadd
。remove
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);
}
}
}
}
内部メソッドが null チェックを行っているraise
ため、それをスキップして、チェックせずにイベントを発生させることができます。
if(oldState != _state)
this->UnitStateChanged(this, gcnew UnitStateChangedEventArgs(oldState, _state));