3

私はこれを理解していることを確認したいだけです...

.net の「イベント」は単なるデリゲートのコレクションです。一部のクラスが「イベント」を取得する場合は、デリゲートがポイントするメソッドで「+」演算子を使用します (一種のオブザーバー)。

したがって、イベントが発生した場合 => 何らかのポインタがコレクション上を歩き、イベント登録で定義されたメソッドを呼び出します。

私はこの説明で正しいですか?「イベント」オブジェクトの Microsoft .net 実装を何らかの方法で確認することは可能ですか?

4

3 に答える 3

5

Event.Netにはオブジェクトはありません。.NetのイベントはすべてMulticastDelegatesに基づいています(.NetのすべてのデリゲートはですMulticastDelegate)。

同じタイプのデリゲートが2つある場合は、+演算子を使用してそれらを組み合わせることができます。これはイベント固有ではありません。

実装される方法MulticastDelegateは、このデリゲートを呼び出すと呼び出される単純なデリゲートを含む呼び出しリストを持っていることです。GetInvocationList()あなたはその代表者を呼ぶことによってそれを見ることができます。

MulticastDelegateまた、 Reflectorのような逆コンパイラーでの実装を試してみることができますがEventHandler、それほど多くはわかりません。すべてフレームワークに直接実装されています。

デリゲートの呼び出しを処理するコードが存在するフレームワークのソースコードを確認したい場合は、SSCLIを試すか、monoのソースコードを確認してみてください(ただし、MSの実装は表示されません)。

于 2012-05-11T01:14:48.493 に答える
3

イベントは、実際には 1 つのデリゲートです。デリゲートは、実際には複数のコールバックをサポートしています。イベントものではありません。

イベントは、プロパティとよく似た方法で使用できます。プロパティには get/set があるのに対し、イベントには add/remove があります (通常、これは自動的に実装されます)。

private EventHandler<EventArgs> myEvent;

public event EventHandler<EventArgs> MyEvent
{
    add
    {
        myEvent = (EventHandler<EventArgs>)Delegate.Combine(myEvent, value);
    }
    remove
    {
        myEvent = (EventHandler<EventArgs>)Delegate.Remove(myEvent, value);
    }
}

イベントが発生すると、基本的にデリゲートが呼び出されます。そこにはあまり魔法はありません。

これが役立つことを願っています。CLR に組み込まれているため、イベントを呼び出すための実装が見つかるとは思いません。Monoソースを見ることができると言われました。

于 2012-05-11T01:18:16.537 に答える
1

イベントは、プロパティとフィールドの相対的なものと同じように、デリゲートをカプセル化すると思います。

于 2012-05-11T01:13:28.843 に答える