0

これは、先週同僚と話をするまで、まったく考えたことがなかった興味深い質問です。

イベント ハンドラーを追加するときは、次のような構文を使用します。

Button1.Click += ClickHandler

私が知る限り、+= は「追加」と同義に、-= は「削除」と同義に使用されます。

私の質問は、なぜ言語の作成者はこの種の構文を使用することを選択したのですか? Button1.Click.Add(ClickHandler) ではないのはなぜですか?

単に追加を意味する場合、フレームワークの作成者は、リストの代わりに .Add() の += 演算子をオーバーロードしないのはなぜですか?

VB.Net の AddHandler と RemoveHandler の存在を説明するのと同じ理由だと思いますが、その理由が何であるかはわかりません。

イベント ハンドラーを追加および削除するための特別な言語構文があるのはなぜですか?

4

2 に答える 2

3

非常に主観的な質問です。構文を定義した人は SO に投稿していないため、14 年前に彼らの動機を推測するために読む必要があります。とにかくそれを突き刺す:

イベントはプロパティとまったく同じです。プロパティがフィールドへのアクセスを制限するように、イベントはデリゲート オブジェクトへのアクセスを制限します。プロパティにはゲッターとセッターがあります。それらを呼び出すには = 記号のみが必要です。1 つあれば十分です。コンパイラは、= 記号に対するプロパティ識別子の位置から、セッターまたはゲッターが意図されているかどうかを判断できます (左がセッター、右がゲッター)。

イベントには、add、remove、raise の 3 つのアクセサーがあります。Raise は C# では (他の言語とは異なり) 実装されていないため、追加と削除の構文だけが必要です。プロパティのようにシンボルを 1 つだけ使用することはできません。配置は役に立ちません。追加の最も自然な記号は+、削除の最も自然な記号は です-。また、基になるデリゲート オブジェクトを論理的に (実際には) 再割り当てするため、割り当てのように動作します。したがって、自然な選択は+=-=です。

デザイナーが実際に同じロジックに従っていたかどうかはわかりません。VB.NET の設計者は、アクセサー (AddHandler、RemoveHandler、RaiseEvent) にマップする言語キーワードを選択しました。しかし、C# は、構文の簡潔さとキーワードの絶対最小数が強力な設計目標であった種類の言語です。C++/CLI は C# によく似ていますが、raise アクセサーがサポートされており、デリゲート オブジェクトを作成するための構文シュガーはまったくありません。これにより、C# を超える機能が提供されます。これは、「バインドされていないデリゲート」と呼ばれる機能であるデリゲート ターゲットにすることに限定されませ

最後に、C# にはあるが C++/CLI にはないデリゲート オブジェクト作成構文シュガーは非常に重要です。書き出すと、次のようなコードが得られるためです。

SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(repaintControls);

これは、.NET プログラミングを始めるすべてのプログラマーの心を悩ませます。イベントのサブスクライブを解除するには、新しいデリゲート オブジェクトを作成する必要がありますか??? そうです。砂糖はもっと分かりやすいです:

SystemEvents.UserPreferenceChanged -= repaintControls;

とにかく、コンパイラは同じコードを生成します。また、VB.NET がキーワードを使用した理由も考えられます。

于 2012-04-22T10:02:00.827 に答える
0

それはすべて好みの問題です。Javaは、あなたが与えたのと同様の理由で、演算子のオーバーロードを許可していません。言葉を読むのが好きな人もいれば、代わりに象徴的な表現を見るのが好きな人もいます。

于 2012-04-22T05:39:36.430 に答える