2

Windows フォーム アプリケーションでは、次のようにイベント ハンドラーを登録できます。

          this.KeyDown += new KeyEventHandler(Form1_KeyDown);

後で同じハンドラーを次のように登録解除します。

          this.KeyDown -= new KeyEventHandler(Form1_KeyDown);

-= には、同じ署名の 2 番目の新しいハンドラーではなく、最初に登録されたのと同じハンドラーが必要であると予想されるため、これは奇妙に思えます。しかし、経験から、私はこれが機能することを知っています。これは、これは特殊なケースであり、実際にはそうであると私に考えさせました

          Form1_KeyDown == new KeyEventHandler(Form1_KeyDown)

その理論に基づいて、次のようなイベントを登録および登録解除するためにコードを頻繁に書き直しました。

          this.KeyDown += Form1_KeyDown;

これは安全ですか?それとも、私が気付いていない意図しない副作用がありますか?

4

1 に答える 1

4

コンパイラは、イベント型から KeyEventHandler デリゲートの新しいインスタンスを作成する必要があることを認識しています。そして、そのコードを自動的に生成します。自由に使用してください。コードを読む人にとっては非常に明確です。

new演算子を含むステートメントでさえ、構文糖衣です。MulticastDelegate コンストラクターは、ステートメントが示唆するような 1 つではなく、Target ( this ) と Method の2 つの引数を取ります。コンパイラは自動的にターゲットを見つけます。イベント サブスクリプションがオブジェクトへの参照を追加することを理解することは重要です。これは、リークの一般的な原因です。

+= 演算子もシンタックス シュガーであり、イベントのアクセサ メソッドを追加するための呼び出しに変換されます。同様に、-= 演算子はremoveアクセサーの呼び出しに変換されます。意図的に隠されている多くの配管。

大事なことを言い忘れましたが、あなたはそれを間違っています。代わりに、フォームの OnKeyDown() メソッドをオーバーライドする必要があります。クラスが独自のイベントをリッスンするのは意味がありません。それらは、他の無関係なコードを対象としています。それはちょっと不運でした。

于 2011-04-27T00:12:15.593 に答える