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