エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Action<T1, T2> デリゲート

2013/12/12

2 つのパラメーターを受け取り、戻り値を持たないメソッドをカプセル化します。

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public delegate void Action<in T1, in T2>(
	T1 arg1,
	T2 arg2
)

型パラメーター

in T1

このデリゲートによってカプセル化されるメソッドの第 1 パラメーターの型。

このパラメーターが反変の型パラメーターです。つまり、指定した型またはより弱い任意の派生型を使用できます。 共変性と反変性の詳細については、「[2678dc63-c7f9-4590-9ddc-0a4df684d42e]」を参照してください。

in T2

このデリゲートによってカプセル化されるメソッドの第 2 パラメーターの型。

パラメーター

arg1
型: T1
このデリゲートによってカプセル化されるメソッドの第 1 パラメーター。
arg2
型: T2
このデリゲートによってカプセル化されるメソッドの第 2 パラメーター。

Action<T1, T2> デリゲートを使用すると、カスタム デリゲートを明示的に宣言しなくても、メソッドをパラメーターとして渡すことができます。カプセル化するメソッドは、このデリゲートによって定義されたメソッドのシグネチャと一致していることが必要です。つまり、カプセル化されるメソッドは、値渡しされる 2 つのパラメーターを受け取ること、および戻り値を持たないことが必要です。戻り値を持たないメソッドとは、C# の場合は、void を返すメソッドを指します。Visual Basic の場合は、Sub で始まり End Sub で終わる構文によって定義されるメソッドを指します。戻り値が無視されるメソッドでもかまいません。こうしたメソッドは、通常、特定の操作を実行する場合に使用されます。

メモメモ:

2 つのパラメーターを受け取って値を返すメソッドを参照するには、汎用 Func<T1, T2, TResult> デリゲートを使用してください。

Action<T1, T2> デリゲートを使用する場合、2 つのパラメーターを持つメソッドについては、それをカプセル化するデリゲートを明示的に定義する必要はありません。たとえば、次のコードでは、ConcatStrings という名前のデリゲートを明示的に宣言しています。その後、このデリゲート インスタンスに対し、2 種類のメソッドへの参照を割り当てます。一方のメソッドは 2 つの文字列をコンソールに書き込むもので、もう一方のメソッドは 2 つの文字列をメッセージ ボックスに書き込むものです。


using System;

delegate void ConcatStrings(string string1, string string2);

public class Example
{
   private static System.Windows.Controls.TextBlock outputBlock;

   public static void Demo(System.Windows.Controls.TextBlock outBlock)
   {
      outputBlock = outBlock;

      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      ConcatStrings concat;

      // Generate a random number and use it to determine which method is
      // assigned to the delegate;
      Random rnd = new Random();
      if (rnd.NextDouble() <= .5) 
         concat = WriteToWindow;
      else
         concat = WriteToConsole;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      outputBlock.Text += String.Format("{0}\n{1}", string1, string2) + "\n";
   }

   private static void WriteToWindow(string string1, string string2)
   {
      System.Windows.Browser.HtmlPage.Window.Alert(string.Format("{0}\n{1}", 
                                                   string1, string2));
   }
}


このコードは、新しいデリゲートを明示的に宣言し、そこに指定のメソッドを割り当てるよりも、次の例のように Action<T1, T2> デリゲートをインスタンス化することによって、簡潔に記述できます。


using System;

public class Example
{
   private static System.Windows.Controls.TextBlock outputBlock;

   public static void Demo(System.Windows.Controls.TextBlock outBlock)
   {
      outputBlock = outBlock;
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      // Generate a random number and use it to determine which method is
      // assigned to the delegate;
      Random rnd = new Random();
      if (rnd.NextDouble() <= .5) 
         concat = WriteToWindow;
      else
         concat = WriteToConsole;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      outputBlock.Text += String.Format("{0}\n{1}\n", string1, string2);
   }

   private static void WriteToWindow(string string1, string string2)
   {
      System.Windows.Browser.HtmlPage.Window.Alert(String.Format("{0}\n{1}\n", 
                                                   string1, string2));
   }
}


次の例に示すように、Action<T1, T2> デリゲートは C# の匿名メソッドと組み合わせて使用することもできます。


using System;

public class TestAnonymousMethod
{
   private static System.Windows.Controls.TextBlock outputBlock;

   public static void Demo(System.Windows.Controls.TextBlock outBlock)
   {
      outputBlock = outBlock;

      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      // Generate a random number and use it to determine which method is
      // assigned to the delegate;
      Random rnd = new Random();
      if (rnd.NextDouble() <= .5) 
         concat = delegate(string s1, string s2) { WriteToWindow(s1, s2); };
      else
         concat = delegate(string s1, string s2) { WriteToConsole(s1, s2); };

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      outputBlock.Text += String.Format("{0}\n{1}", string1, string2) + "\n";
   }

   private static void WriteToWindow(string string1, string string2)
   {
      System.Windows.Browser.HtmlPage.Window.Alert(string.Format("{0}\n{1}", 
                                                   string1, string2));
   }
}


次の例に示すように、Action<T1, T2> デリゲートのインスタンスにはラムダ式を割り当てることもできます。


using System;

public class Example
{
   private static System.Windows.Controls.TextBlock outputBlock;

   public static void Demo(System.Windows.Controls.TextBlock outBlock)
   {
      outputBlock = outBlock;

      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      // Generate a random number and use it to determine which method is
      // assigned to the delegate;
      Random rnd = new Random();
      if (rnd.NextDouble() <= .5) 
         concat = (s1, s2) => WriteToWindow(s1, s2);
      else
         concat = (s1, s2) => WriteToConsole(s1, s2);

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      outputBlock.Text += String.Format("{0}\n{1}", string1, string2) + "\n";
   }

   private static void WriteToWindow(string string1, string string2)
   {
      System.Windows.Browser.HtmlPage.Window.Alert(string.Format("{0}\n{1}", 
                                                   string1, string2));
   }
}


Windows Phone OS

サポート: 8.0, 7.1, 7.0

リファレンス

表示:
© 2014 Microsoft