1. 委任とは何ですか?
実は、デリゲーションについてもっと徹底的に説明する方法をずっと考えていました。正直に言うと、問題をさまざまな角度から見ているので、人それぞれ意見が異なります。個人的には、以下の2点から理解できるのではないかと考えています:
(1) データ構造的には、デリゲーションはクラスと同様のユーザー定義型です。
(2) デザインパターンの観点から見ると、デリゲート (クラス) はメソッド (オブジェクト) の抽象化を提供します。
デリゲートは型なので、どのようなデータを保存するのでしょうか?
デリゲートはメソッドの抽象化であり、同じシグネチャと戻り値の型を持つ一連のメソッドのアドレスを格納することがわかっています。デリゲートが呼び出されると、デリゲートに含まれるすべてのメソッドが実行されます。
2. デリゲート型の定義
クラスが型であるのと同じように、デリゲートも型です。クラスと同様、デリゲート型は、変数や型オブジェクトの作成に使用する前に宣言する必要があります。
delegate void MyDel(int x);
デリゲート型宣言:
(1) delegateキーワードで始まります。
(2) 戻り値の型 + デリゲートの型名 + パラメーターのリスト。
3. デリゲート変数を宣言する
MyDel del1,del2;
4. デリゲート変数を初期化する
(1) 新しい演算子を使用する
新しい演算子のオペランドの構成は次のとおりです。
呼び出しリストの最初のメンバーとしてメソッドの名前を含む丸かっこのセット。メソッドには、インスタンス メソッドまたは静的メソッドを指定できます。
del1 = new MyDel( myInstObj.MyM1 ); del2 = new MyDel( SClass.OtherM2 );
(2) メソッド指定子のみで構成されるショートカット構文
クイックキー構文を使用します。これが機能するのは、メソッド名とそれに対応するデリゲート型の間に暗黙的な変換があるためです。
del1 = myInstObj.MyM1; del2 = SClass.OtherM2;
5. 代入デリゲート
デリゲートは参照型なので、値を代入することでデリゲート変数に含まれるメソッドのアドレス参照を変更できます。古い参照はガベージ コレクターによって再利用されます。
MyDel del; del = myInstaObj.MyM1; //委托初始化 del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收
6. デリゲートの結合
追加の演算子を使用してデリゲートを結合できます。この操作は最終的に、2 つのオペランドのデリゲート呼び出しリストのコピーを連結した呼び出しリストを持つ新しいデリゲートを作成します。
デリゲートは定数であり、オペランド デリゲートは作成後に変更されません。デリゲートの組み合わせはオペランドのコピーをコピーします。
MyDel del1 = myObj.MyMethod; MyDel del2 = SClass.OtherM2; MyDel del3 = del1 + del2; //组合调用列表
7. デリゲートの加算および減算演算
+= 演算子を使用して、デリゲートに新しいメソッドを追加できます。
-= 演算子を使用してデリゲートからメソッドを削除することもできます。
MyDel del = myObj.MyMethod; del += SClass.OtherM2; // 增加方法del -= myObj.MyMethod; // 移除方法
8. デリゲート呼び出し
デリゲート呼び出しはメソッド呼び出しと似ています。デリゲートが呼び出された後、呼び出しリスト内の各メソッドが実行されます。
デリゲートを呼び出す前に、デリゲートが空かどうかを判断する必要があります。空のデリゲートを呼び出すと例外がスローされます。
if(null != del) { del();//委托调用}
9. 匿名メソッド
匿名メソッドは、デリゲートの初期化時にインラインで宣言されるメソッドです。
基本構造:
deleage( 参数 ) { 语句块 }
例:
delegate int MyDel (int x); //定义一个委托 MyDel del = delegate( int x){ return x; };
上記から、匿名メソッドは宣言された戻り値を表示しないことがわかります。
10. ラムダ式
ラムダ式は主に匿名メソッドの構文を簡素化するために使用されます。匿名メソッドでは、デリゲートにメソッドが割り当てられていることをコンパイラがすでに認識しているため、デリゲート キーワードは少し冗長です。いくつかの簡単な手順で、匿名メソッドを Lambda 式に変換できます。
デリゲート キーワードを削除します。
パラメーター リストと匿名メソッド本体の間に Lambda 演算子 => が含まれないようにします。ラムダ演算子は「goes to」と発音されます。
りー