Action<T> 代理人

定義

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

generic <typename T>
public delegate void Action(T obj);
public delegate void Action<in T>(T obj);
public delegate void Action<T>(T obj);
type Action<'T> = delegate of 'T -> unit
Public Delegate Sub Action(Of In T)(obj As T)
Public Delegate Sub Action(Of T)(obj As T)

型パラメーター

T

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

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

パラメーター

obj
T

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

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

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
*/
Imports System.Collections.Generic

Class Program
    Shared Sub Main()
        Dim names As New List(Of 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(AddressOf Print)
    End Sub

    Shared Sub Print(ByVal s As String)
        Console.WriteLine(s)
    End Sub
End Class

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

注釈

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

注意

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

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

#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::Windows::Forms;

public delegate void DisplayMessage(String^ message);

public ref class TestCustomDelegate
{
public:
   static void ShowWindowsMessage(String^ message)
   {
      MessageBox::Show(message);      
   }
};

int main()
{
    DisplayMessage^ messageTarget; 
      
    if (Environment::GetCommandLineArgs()->Length > 1)
       messageTarget = gcnew DisplayMessage(&TestCustomDelegate::ShowWindowsMessage);
    else
       messageTarget = gcnew DisplayMessage(&Console::WriteLine);
    
    messageTarget(L"Hello World!");
    return 0;
}
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);
   }
}
Delegate Sub DisplayMessage(message As String) 

Module TestCustomDelegate
   Public Sub Main
      Dim messageTarget As DisplayMessage 

      If Environment.GetCommandLineArgs().Length > 1 Then
         messageTarget = AddressOf ShowWindowsMessage
      Else
         messageTarget = AddressOf Console.WriteLine
      End If
      messageTarget("Hello, World!")
   End Sub
   
   Private Sub ShowWindowsMessage(message As String)
      MsgBox(message)
   End Sub   
End Module

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

#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::Windows::Forms;

namespace ActionExample
{
   public ref class Message
   {
   public:
      static void ShowWindowsMessage(String^ message)
      {
         MessageBox::Show(message);
      }
   };
}

int main()
{
   Action<String^>^ messageTarget;

   if (Environment::GetCommandLineArgs()->Length > 1)
      messageTarget = gcnew Action<String^>(&ActionExample::Message::ShowWindowsMessage);
   else
      messageTarget = gcnew Action<String^>(&Console::WriteLine);

   messageTarget("Hello, World!");
   return 0;
}
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);
   }
}
Module TestAction1
   Public Sub Main
      Dim messageTarget As Action(Of String) 

      If Environment.GetCommandLineArgs().Length > 1 Then
         messageTarget = AddressOf ShowWindowsMessage
      Else
         messageTarget = AddressOf Console.WriteLine
      End If
      messageTarget("Hello, World!")
   End Sub
   
   Private Sub ShowWindowsMessage(message As String)
      MsgBox(message)
   End Sub   
End Module

Action<T>次の例に示すように、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> ます。 (ラムダ式の概要については、「 ラムダ式」を参照してください)。

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);
   }
}
Imports System.Windows.Forms

Public Module TestLambdaExpression
   Public Sub Main()
      Dim messageTarget As Action(Of String) 
      
      If Environment.GetCommandLineArgs().Length > 1 Then
         messageTarget = Sub(s) ShowWindowsMessage(s) 
      Else
         messageTarget = Sub(s) ShowConsoleMessage(s)
      End If
      messageTarget("Hello, World!")
   End Sub
      
   Private Function ShowWindowsMessage(message As String) As Integer
      Return MessageBox.Show(message)      
   End Function
   
   Private Function ShowConsoleMessage(message As String) As Integer
      Console.WriteLine(message)
      Return 0
   End Function
End Module

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

拡張メソッド

GetMethodInfo(Delegate)

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

適用対象

こちらもご覧ください