15.C#--依頼


1.C#依頼(Delegate)
理論:委任(Delegate)はCまたはC++の関数のポインタに似ています.委任(Delegate)は、あるメソッドへの参照が格納されている参照タイプ変数です.参照は実行時に変更できます.委任(Delegate)は、イベントおよびコールバックメソッドの実装に特に使用されます.すべての委任(Delegate)はSystem.Delegateクラスから派生します.委任を宣言します.(Delegte)委任宣言は、その委任によって参照できる方法を決定する.委任(Delegte)は、ある方法への参照が格納されている参照タイプ変数である.参照は実行時に変更される.例えば、public delegate int MyDelegate(string s);上記の依頼は、単一のstringパラメータを有する任意の方法を参照し、intタイプ変数を返すために使用することができる.依頼を宣言する構文は、delegateインスタンス化依頼です.(Delegte)依頼タイプが宣言されると、依頼オブジェクトはnewキーワードを使用して作成され、特定のメソッドに関連付けられている必要があります.依頼を作成すると、new文に渡されるパラメータはメソッド呼び出しのように書かれますが、パラメータはありません.たとえば、public delegate void printString(string);...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);次の例では、整数パラメータを持つメソッドを参照し、整数値を返すために使用できる委任の宣言、インスタンス化、および使用を示します.例:
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         //       
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         //           
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }}

上記のコードがコンパイル実行されると、Value of Num:35 Value of Num:1752という結果になります.委託マルチキャスト(Multicasting of a Delegate)
理論:委任先は「+」演算子を使用してマージできます.
1つのマージ依頼は、マージされた2つの依頼を呼び出します.同じタイプの依頼のみがマージできます.
「-」演算子は、結合された委任からコンポーネント委任を除去するために使用できます.委任のこの有用な特徴を使用すると、委任が呼び出されたときに呼び出されるメソッドの呼び出しリストを作成できます.
これは依頼マルチキャスト(multicasting)と呼ばれ、マルチキャストとも呼ばれる.
以下のプログラムでは,依頼されたマルチキャストを実証した.
例:
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         //       
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         //     
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }}

上のコードがコンパイルされて実行されると、Value of Num:75という結果になります.
3.依頼(Delegate)の用途以下の例で依頼の使い方を示した.
依頼printStringは、入力メソッドとして文字列を持つメソッドを参照するために使用でき、何も返されません.この依頼を使用して、2つの方法を呼び出します.1つ目は文字列をコンソールに印刷し、2つ目は文字列をファイルに印刷します.
例:
using System;
using System.IO;
namespace DelegateAppl{
   class PrintString
   {
      static FileStream fs;
      static StreamWriter sw;
      //     
      public delegate void printString(string s);

      //          
      public static void WriteToScreen(string str)
      {
         Console.WriteLine("The String is: {0}", str);
      }
      //         
      public static void WriteToFile(string s)
      {
         fs = new FileStream("c:\\message.txt",
         FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
         sw.WriteLine(s);
         sw.Flush();
         sw.Close();
         fs.Close();
      }
      //           ,        
      public static void sendString(printString ps)
      {
         ps("Hello World");
      }
      static void Main(string[] args)
      {
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
         sendString(ps1);
         sendString(ps2);
         Console.ReadKey();
      }
   }}

上のコードがコンパイルされ実行されると、The String is:Hello Worldという結果になります.
 
参照先:
http://outofmemory.cn/csharp/tutorial/csharp-delegate.html