74230


C#で自分のクラスの中でイベントを追加、削除する場合に  
追加したよりも多くの削除をしても何もエラーが起きないですが  
ライブラリ内部で調整しているのでしょうか

以下のようなソースでイベントの登録削除を作って  
削除をいくらしても登録を1回すればちゃんとイベントが発生するので、削除イベントの削除に関してはし損ねることのみを気にしておけばいいと言うことでしょうか

[code]

    public MainWindow()
            {
                InitializeComponent();
                plus.AllowDrop = true;
            }
    
            private void plus_Click(object sender, RoutedEventArgs e)
            {
                Debug.WriteLine("plus");
                plus.DragEnter += Plus_DragEnter;
            }
    
            private void Plus_DragEnter(object sender, DragEventArgs e)
            {
    
            }
    
            private void minus_Click(object sender, RoutedEventArgs e)
            {
                Debug.WriteLine("minus");
                plus.DragEnter -= Plus_DragEnter;
            }
    
[/code]


CC BY-SA 4.0
2021-02-23T08:28:01.293
74226
2021-02-23T11:14:23.413
10098
question
c# event
C#でイベントの削除


イベントというよりはデリゲートの仕様です。

C# (.NET) のデリゲートは`+`, `-`, `+=`,
`-=`演算子による結合と削除（マルチキャストデリゲート）をサポートしており、内部的にはデリゲートオブジェクトのリスト（呼び出しリスト;
invocation list）への追加／削除が実行されます。

  * [\- および -= 演算子 - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/subtraction-operator)

> 右側のオペランドの呼び出しリストが左側のオペランドの呼び出しリストの適切な連続するサブリストでない場合は、演算結果は左側のオペランドになります。
> たとえば、マルチキャストのデリゲートの一部ではないデリゲートを削除しても何も行われず、マルチキャストのデリゲートは変更されません。

デリゲートの結合と削除は、内部的には`System.Delegate`クラスの`Combine()`メソッドや`Remove()`メソッド呼び出しに展開されます。

  * [Delegate Class (System) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.delegate)

C#の`event`は、カプセル化のために`add`, `remove`アクセッサーを使ってデリゲートの操作に制限をかけているだけです。通常は`add`,
`remove`アクセッサーをプログラマーがカスタム定義することはなく、コンパイラーによって自動生成されたものを使います。

  * [event - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/event)


CC BY-SA 4.0
2021-02-23T11:14:23.413
74230
2021-02-23T11:14:23.413
15413
74226
answer