デリゲート型の意味は参照型の序文で説明されています (クリックして表示)。つまり、デリゲートはメソッドの型を定義するクラスであり、メソッドを として渡すことができます。端的に言えば、メソッドをパラメータとして渡すことができます。すべてのデリゲート (Delegate) は System.Delegate クラスから派生します。
HC5 のルームメイト55 は LOL の愛好家で、淘宝網で買い物をするのも好きです。LOL に夢中になっていると、宅配便が彼に電話して、速達を迎えに来てゲームをするように頼みました。それで、彼は私に尋ねました。この時点で、ルームメイトを (ルームフレンド) クラスとみなし、宅配便を受け取るのはクラス (takepackage()) のメソッドであり、インスタンス化されたオブジェクト (an) を使用しています。メソッドを実行できるオブジェクト) ルームメイトから速達を受け取るメソッドを「実行」します。
デリゲートの宣言:
デリゲートの宣言により、デリゲートが参照できるメソッドが決まります。デリゲートは、同じラベルを持つメソッドを指すことができます。
たとえば、デリゲートを宣言します。
public delegate int MyDelegate(string str); //string类型的变量就是它的标签
上記のデリゲートは、単一の文字列パラメーターを受け取り、int 型の変数を返すメソッドを参照するために使用できます。
デリゲートをインスタンス化します:
デリゲートの型が宣言されたら、デリゲート オブジェクトを new キーワードを使用して作成し、特定のオブジェクトに関連付ける必要があります。方法。デリゲートを作成するとき、メソッドはパラメータなしで変数として新しいステートメントに渡されます。 例:
public delegate int MyDelegate(string str); //委托的声明 ..... public static int Add(string s); //定义的一个方法 ..... MyDelegate my = new MyDelegate(Add) ; //实例化一个委托,其实就是实例化一个对象
コード例:
速達を受け取る話に戻り、この話をコードに変換しました:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { public delegate void MyDelegate(string str); //委托的声明 class roomfriend //定义室友这个类 { public static void takepackage(string name) //定义一个取快递的方法 { Console.WriteLine("我叫 {0} 这是一个取快递方法",name); } } class program { static void Main(string[] args) { MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入) myd("HC555"); //由我实现室友的方法,实际是室友的方法当参数传给了我 } } }
結果は次のようになります:
速達便を利用して返却してください。 寮にいるとき、ルームメイトから電話があり、お腹が空いたとのことで、スーパーの前を通るときに何か食べるものを買ってくるように言われました。ここでの「何かを買う」ということはルームメイトのAメソッドとも捉えられ、「私」は彼からの「メソッド」を持っている。 C# で「+=」を使用してマージ メソッドを順番に接続し、呼び出されたときに順番に出力します
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { public delegate void MyDelegate(string str); //委托的声明 class roomfriend //定义室友这个类 { public static void takepackage(string name) //定义一个取快递的方法 { Console.WriteLine("我叫 {0} 这是一个取快递方法",name); } public static void shopping(string name) //定义一个买东西的方法 { Console.WriteLine("我叫 {0} 这是一个买东西的方法",name); } } class program { static void Main(string[] args) { MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入) myd += roomfriend.shopping; // += 合并运算顺序执行方法 myd("HC555"); } } }
結果は次のとおりです。はまだ... 0.0)
上記では、メソッドを接続するために「+=」を使用します。メソッドをキャンセルしたい場合は、「-=」を使用して「I」との桁上げ関係を自然にキャンセルできます。 myd -= roomfriend.takepackage //それを += の下に置くだけで、速達を受け取るメソッドが再び呼び出されないようになります。
スーパーでビスケットを数箱買ったら、また私のルームメイトから電話が鳴り、その荷物はガールフレンド宛だったので、良い人が届けてくれるように頼んできました。彼も最後まで同意してくれました。 。ガールフレンドに宅配便を届けているとき、彼女は急いでいたので、ビスケットの箱を含む私の持ち物をすべて持ち去ってしまいました。 。そして、私は笑って寮に戻りました... ここでは、受け入れる (accept) メソッドを持つ別の (ガールフレンド) クラスを定義し、I (デリゲート) をメソッドのパラメータとして使用します メソッドを定義します。 : public static void accept(string name,MyDelegate Pack); デリゲートをボックスとして考えると、そのボックスには同じ種類のパラメーターを持つメソッドがいっぱいになります。 MyDelegate のパックと文字列名を比較します。 name は文字列型の変数であり、pack は MyDelegate 型の変数であると言えます。えー
結果は同じです反省:
上で示した例では、「ルームメイト」または「ルームメイトのガールフレンド」をクラスとみなし、インスタンス化されたオブジェクトを使用する場合は、オブジェクトのメソッド名を介して型名を使用します。デリゲートに渡される参照メソッド:
Roomfriend myfriend = new roomfriend(); // roommate のオブジェクトをインスタンス化します
MyDelegate myd = new MyDelegate(myfriend.tackpackage); // ここでエラーが発生します。インスタンス参照を通じてメンバーにアクセスすることはできません
roomfriend のインスタンス オブジェクトを使用するとエラーが発生するのはなぜですか?コード内で takepackage をパブリック アクセスとして宣言しましたが、これはメソッドを定義するときに使用した static に関連していることがわかります (これについては後で説明します)。これはできます
上記は C# 学習日記 19 の内容です----参照型デリゲート (Delegate) 型の詳細については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。 !