1

C#では、次のようなイベントハンドラーをアタッチします。

form1.Click += new EventHandler(form1_Click);

「プラス」記号の意味は何ですか?コントロールに多くのイベントハンドラーをアタッチできることを知っているので、+=構文は理にかなっています。しかし、私もこれだけを書くことができるはずだと思います:

form1.Click = new EventHandler(form1_Click);

以前のすべてのハンドラーをオーバーライドして最後のハンドラーのみをアタッチできるようにしますが、コンパイルされません。+=当然、演算子は文字列や整数の場合と同じように機能する必要があると思います。ハンドラーを強制する ための設計原則は何ですか?言い換えれば、なぜ私はちょうど書くことができないのですか?+==

4

5 に答える 5

4

イベントハンドラーは、デリゲートの配列によって内部的に表されるため、通常の演算子+=-=演算子が適用されます。

ただし、で直接割り当てられたものを使用できますが、=これはイベントを定義するクラス内でのみ使用できます。これにより、割り当てているものに置き換えられた以前のすべてのイベントハンドラーが消去されます。

于 2012-09-20T04:31:05.140 に答える
3

この記事では公開と購読のセクションをご覧ください。

C#では、任意のオブジェクトが、他のクラスがサブスクライブできる一連のイベントを公開できます。パブリッシングクラスがイベントを発生させると、サブスクライブされたすべてのクラスに通知されます。

したがって、あなたは購読者であり、すでに購読している人のリストに影響を与えることを心配していません。それは出版社の能力にあります。

プログラマー次第だと言えば、「パブリッシャー」クラスを開発して、パブリックメソッドを提供し、サブスクライバーにイベントサブスクリプションをリセットする機会を与えることができます。フレームワークでは、設計上禁止されています。これは、特定のプログラマーによる決定でもあります。

于 2012-09-20T04:50:15.737 に答える
2

そのような

a += 2

つまり、

a = a + 2

やったら

a = 2

これにより、値が消去され、2に置き換えられます。

同様に

form1.Click += new EventHandler(form1_Click);

意味

form1.Click = form1.Click +  new EventHandler(form1_Click);

これは、form1.clickが以前に行っていたことにイベントハンドラーを追加することを意味します。

これで、form1.Clickはデフォルトで実行することを実行し、form1_clickで実行したいことも実行します。

私たちが書いた場合

form1.Click = new EventHandler(form1_Click);

これにより、以前のすべてのイベントハンドラーが消去され、form1_Click

于 2012-09-20T04:30:28.920 に答える
2

構文を使用してを定義するeventと、デフォルトで定義れます。ここでのポイントは、あなたが公にと対話する唯一の方法は、とを介することです(それぞれとによってアクセスされます)。この言語では「すべてリセット」アクションが許可されていないため、許可されていません。event SomeHandler SomeEventaddremoveeventaddremove+=-==

このための「設計上の選択」のより根本的な質問に対処するために...私は、加入者がサブスクリプションを自由に追加および削除できるマルチキャストモデルの契約が原動力であると思います。event誰もがすべてのサブスクライバーのサブスクリプションを解除できるようにすると、その契約に違反し、1人のサブスクライバーのみを許可することは契約ではありません

補遺: あなたが探しているのは、デリゲートを直接公開する機能のようです。これは、.NETのマルチキャストデリゲート構文に依存している場合に実行できます。event構文によく似ていますが、でクリアすることができ、(出力を参照)で=理解するのに十分賢いです。+=null delegate

public delegate void F(int x);

public static void Main()
{
    F f = null;
    f += x => System.Console.WriteLine("First: {0}", x);
    f += x => System.Console.WriteLine("Second: {0}", x);
    f(5);
}

eventまたは、add/の長い形式を使用しremoveて内部リストをヒットし、そのリストをクリアできるメソッドを提供することもできます。

于 2012-09-20T04:41:33.973 に答える
1

それらを1つも、1つも、または多くも持つことができるので、反対側を使用して1つ追加(サブスクライブ)する+=か、そうでなければ削除(サブスクライブ解除)します。-=

form1.Click += new EventHandler(form1_Click); 
// click here will execute form1_Click
form1.Click += new EventHandler(form1_Click2);
// click here will execute form1_Click1 AND form1_Click2
form1.Click -= new EventHandler(form1_Click1);
// click here will JUST execute form1_Click2

現在、+ =の使用を強制すると、開発者が自分の足を撃つことができなくなります。つまり、他のクラスからform1.Click = ...を呼び出せるようにすると、1人のユーザーが他の接続されたデリゲートを意図せずにクリアできるようになります。これが、デフォルトで適用される理由です。

于 2012-09-20T04:28:31.690 に答える