C# [イベント委任に関する誤解を理解する]

イベント

イベント (イベント) は基本的に、キーの押下、クリック、マウスの移動などのユーザー操作、またはシステムによって生成される通知などのプロンプト情報です。アプリケーションはイベントが発生したときにそれに応答する必要があります

デリゲートは関数の型を定義することと同じです。

イベントはデリゲート上に構築されたイベントであり、デリゲート関数ポインター (コールバック関数ポインター) を定義するのと同等です。

イベントを使用すると、オブジェクトまたはクラスが他のクラスのメソッドを通知し、実行できるようになります。

原理:

たとえば、クラスのベルが鳴ると、生徒が教室に入り、教師が授業を開始します。
要素を分解します
。ベル: パブリッシャー。
ベル: イベント トリガー、メッセージの公開。
生徒教師: サブスクライバー。
教室とクラスに入る: の実行関数。イベント。

誤解したコードは逆に理解する必要がある

上記の内容は理解しやすいですが、コードにマッピングすると混乱しやすいです。
要件に対応します。
サブページの [追加] をクリックして、親ページを更新します。
パブリッシャーのサブページは、
ここでイベントとデリゲートを定義します
。ここでの呼び出しは、
通常の関数の呼び出しと実行として理解するのではなく、すべてのサブスクライバーに情報を公開するものとして理解するのが最善です。

 刷新列表页数据的委托
        public event EventHandler ReloadList;
  当来到触发节点是 通知  所有的订阅者 

 ReloadList(this, new MyEventArg {
    
     query = PName.Text });
```csharp

サブスクライバとサブスクリプション
親ノードとイベント実行関数のバインディング
親クラスは、サブクラスのイベント添付のためにサブクラスによって実行されるイベント関数を呼び出すことができます。
これは、親クラスがサブクラスのイベントをサブスクライブしていると理解する必要があります。親クラスは、サブクラス イベントが発生したときに、あなたが行うことについて同意します。
たとえば、教師は、ベルが鳴ったら授業を開始することに同意します。

在父类内部 

childForm.ReloadList+= fatherFunc
       

イベント関数の実行は、
デリゲートのパラメーターと一致するように親クラス内で定義されます。イベント パラメーターを受け入れることは一般的な方法ではありません。

 private void LoadDocList(object sender, EventArgs e)
        {
    
    
            List<DocDetail> details;
            MyEventArg myEventArg1 = e as MyEventArg; 
            details = documentBLL.GetProDocDetail(myEventArg1.query);             gridControl1.DataSource = details;
        }

複数のサブスクライバーと異なる実行方法が存在する可能性があるため、パラメーターがイベント定義と一致する任意のデリゲートを実行のためにイベントに追加できます。

一般に、コードを逆から理解した方がよい場合があります。

おすすめ

転載: blog.csdn.net/qq_43886548/article/details/129128451