非常に主観的な質問です。構文を定義した人は 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 がキーワードを使用した理由も考えられます。