英語で読む

次の方法で共有


Action<T> 代理人

定義

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

C#
public delegate void Action<in T>(T obj);
C#
public delegate void Action<T>(T obj);

型パラメーター

T

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

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。

パラメーター

obj
T

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

次の例では、 デリゲートを使用して Action<T> オブジェクトの内容を印刷する方法を List<T> 示します。 この例では、 メソッドを Print 使用して、リストの内容をコンソールに表示します。 さらに、C# の例では、匿名メソッドを使用して内容をコンソールに表示する方法も示しています。 この例では変数を明示的に宣言しないことに Action<T> 注意してください。 代わりに、1 つのパラメーターを受け取り、1 つのパラメーターがデリゲートであるメソッドに値を返さないメソッドへの List<T>.ForEach 参照を Action<T> 渡します。 同様に、C# の例では、Action<T>匿名メソッドのシグネチャが メソッドで予期List<T>.ForEachされるデリゲートのシグネチャAction<T>と一致するため、デリゲートは明示的にインスタンス化されません。

C#
List<string> names = new List<string>();
names.Add("Bruce");
names.Add("Alfred");
names.Add("Tim");
names.Add("Richard");

// Display the contents of the list using the Print method.
names.ForEach(Print);

// The following demonstrates the anonymous method feature of C#
// to display the contents of the list to the console.
names.ForEach(delegate(string name)
{
    Console.WriteLine(name);
});

void Print(string s)
{
    Console.WriteLine(s);
}

/* This code will produce output similar to the following:
* Bruce
* Alfred
* Tim
* Richard
* Bruce
* Alfred
* Tim
* Richard
*/

注釈

デリゲートを Action<T> 使用すると、カスタム デリゲートを明示的に宣言せずに、メソッドをパラメーターとして渡すことができます。 カプセル化されたメソッドは、このデリゲートによって定義されるメソッド シグネチャに対応している必要があります。 つまり、カプセル化されたメソッドには、値によって渡されるパラメーターが 1 つ必要であり、値を返してはなりません。 (C# では、 メソッドは を返すvoid必要があります。Visual Basic では、...End Sub コンストラクトで定義するSub必要があります。また、無視される値を返すメソッドを指定することもできます。通常、このようなメソッドは操作を実行するために使用されます。

注意

1 つのパラメーターを持ち、値を返すメソッドを参照するには、代わりにジェネリック Func<T,TResult> デリゲートを使用します。

デリゲートを Action<T> 使用する場合、1 つのパラメーターを持つメソッドをカプセル化するデリゲートを明示的に定義する必要はありません。 たとえば、次のコードでは、 という名前 DisplayMessage のデリゲートを明示的に宣言し、 メソッドまたは メソッドへの WriteLine 参照を ShowWindowsMessage そのデリゲート インスタンスに割り当てます。

C#
using System;
using System.Windows.Forms;

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

次の例では、新しいデリゲートを明示的に定義して名前付きメソッドを Action<T> 割り当てる代わりに、 デリゲートをインスタンス化することで、このコードを簡略化します。

C#
using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

次の例に Action<T> 示すように、C# の匿名メソッドで デリゲートを使用することもできます。 (匿名メソッドの概要については、「 匿名メソッド」を参照してください)。

C#
using System;
using System.Windows.Forms;

public class TestAnonMethod
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = delegate(string s) { ShowWindowsMessage(s); };
      else
         messageTarget = delegate(string s) { Console.WriteLine(s); };

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

次の例に示すように、ラムダ式を Action<T> デリゲート インスタンスに割り当てることもできます。 (ラムダ式の概要については、「 ラムダ式」を参照してください)。

C#
using System;
using System.Windows.Forms;

public class TestLambdaExpression
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = s => ShowWindowsMessage(s);
      else
         messageTarget = s => Console.WriteLine(s);

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

メソッドと ForEach メソッドはそれぞれForEach、デリゲートをAction<T>パラメーターとして受け取ります。 デリゲートによってカプセル化された メソッドを使用すると、配列またはリスト内の各要素に対してアクションを実行できます。 この例では、 メソッドを ForEach 使用して図を示します。

拡張メソッド

GetMethodInfo(Delegate)

指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください