C#のデリゲート(委任)
CまたはC ++の関数ポインタに似たC#のプリンシパル(委任)。プリンシパル(委任)参照型変数の参照する方法があります。参照は、実行時に変更することができます。
特にイベントとコールバックメソッドのために意図されたプリンシパル(委任)。 すべてのデリゲート(委任)は、System.Delegateクラスから派生しています。
文委員会(デリゲート)
プロキシ文は、メソッドがデリゲートによって参照することができる決定します。 デリゲートは、同じラベルを有する方法を指すことができます。
たとえば、あなたがデリゲートを持っていると仮定します。
パブリックデリゲートint型MyDelegate(文字列s);
上記の手数料は、単一の文字列パラメータを取り、int型の変数を返します任意の方法を指すために使用することができます。
次のように委託宣言するための構文は次のとおりです。
デリゲート<戻り値の型> <デリゲート名> <パラメータリスト>
手数料の例(デリゲート)
一度デリゲート型を宣言し、デリゲートオブジェクトを作成するために、新しいキーワードを使用して、特定のメソッドを持つ必要があります。あなたが書いてありませんが、引数のように、メソッド呼び出しとして新しい文に渡されたデリゲートのパラメータを作成するとき。 例えば:
パブリックデリゲート無効printString(文字列s); ... printString PS1 =新しいprintString(WriteToScreen)。 printString PS2 =新しいprintString(WRITETOFILE)。
次の例では、インスタンス化して使用、委員会の声明を実証し、デリゲートは、整数の引数を持つメソッドを参照するために使用され、整数値を返すことができます。
システムを用いました。 int型NumberChanger(int型n)を委任する。 名前空間DelegateAppl { クラスTestDelegate { 静的なint型numの= 10; パブリックstatic int型AddNum(int型のp) { NUM + = P; NUMを返します。 } パブリックstatic int型MultNum(int型のq) { NUM * = Q; NUMを返します。 } パブリックstatic int型getNum() { NUMを返します。 } 静的な無効メイン(文字列[] args) { //デリゲートインスタンスNumberChanger NC1 =新しいNumberChanger(AddNum)を作成します。 NumberChanger NC2 =新しいNumberChanger(MultNum)。 //デリゲートオブジェクトNC1(25)を使用してメソッドを呼び出します。 Console.WriteLineを( "民の値:{0}"、getNum()); NC2(5)。 Console.WriteLineを( "民の値:{0}"、getNum()); Console.ReadKey()。 } } }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
民の値:35 民の値:175
委託マルチキャスト(委任のマルチキャスト)
デリゲートオブジェクトは、マージする "+"演算子を使用することができます。 2代表団をマージマージ、それを呼び出すためのデリゲート。 信頼の唯一の同じタイプを組み合わせることができます。 " - "演算子は、結合委任代理人から成分を除去するために使用することができます。
委託この便利な機能を使って、あなたは、デリゲートのリストを作成することができ、呼び出すために呼び出されたときにメソッドを呼び出します。 これは、マルチキャストと呼ばれる、委任マルチキャスト(マルチキャスト)と呼ばれています。 次のプログラムは、マルチキャストデリゲートを示しています。
システムを用いました。 int型NumberChanger(int型n)を委任する。 名前空間DelegateAppl { クラスTestDelegate { 静的なint型numの= 10; パブリックstatic int型AddNum(int型のp) { NUM + = P; NUMを返します。 } パブリックstatic int型MultNum(int型のq) { NUM * = Q; NUMを返します。 } パブリックstatic int型getNum() { NUMを返します。 } 静的な無効メイン(文字列[] args) { //デリゲートインスタンスNumberChanger NCを作成します。 NumberChanger NC1 =新しいNumberChanger(AddNum)。 NumberChanger NC2 =新しいNumberChanger(MultNum)。 NC = NC1; NC + = NC2。 //マルチキャストNCを呼び出します(5)。 Console.WriteLineを( "民の値:{0}"、getNum()); Console.ReadKey()。 } } }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
民の値:75
プリンシパル(デリゲート)の用途
次の例では、委任の使用方法を示しています。 校長printStringは、入力として文字列でメソッドを参照するために使用されると、何も返しません。
私たちは、ファイルに印刷するには、2つの方法、コンソールに出力最初の文字列、および2番目の文字列を呼び出すために、このデリゲートを使用します。
システムを用いました。 System.IOを使用しました。 名前空間DelegateAppl { クラスPrintString { 静的のFileStream fsの。 静的なのStreamWriterのSW。 //プロキシの文パブリックデリゲートボイドprintString(文字列s); //コンソールのパブリック静的な無効WriteToScreenにこの方法を印刷(文字列str) { Console.WriteLineを( "文字列がある:{0}"、文字列); } //このメソッドは、プリント公共の静的な無効WRITETOFILEを提出する(文字列s) { FS =新しいFileStreamを( "C:\\ message.txt」、 FileMode.APPEND、FileAccess.Write)。 SW =新しいのStreamWriter(FS)。 sw.WriteLine(複数可)。 sw.Flush()。 sw.Close()。 fs.Close()。 } //このメソッドのデリゲートパラメータとして、及び(PSをprintString)メソッドパブリック静的ボイドsendStringを呼び出すためにそれを使用します { PS(「Hello World」の); } 静的な無効メイン(文字列[] args) { printString PS1 =新しいprintString(WriteToScreen)。 printString PS2 =新しいprintString(WRITETOFILE)。 sendString(PS1); sendString(PS2); Console.ReadKey()。 } } }
上記のコードはコンパイルされ、実行されると、次の結果を生成します。
文字列は、次のとおりです。ハローワールド