Action<T> 代理人
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
1 つのパラメーターを持ち、値を返さないメソッドをカプセル化します。
generic <typename T>
public delegate void Action(T obj);
public delegate void Action<in T>(T obj);
public delegate void Action<in T>(T obj) where T : allows ref struct;
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 つのパラメーターが Action<T> デリゲートである List<T>.ForEach メソッドに値を返さないメソッドへの参照を渡します。 同様に、C# の例では、匿名メソッドのシグネチャが、List<T>.ForEach メソッドで予期されるAction<T> デリゲートのシグネチャと一致するため、Action<T> デリゲートは明示的にインスタンス化されません。
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
*/
// F# provides a type alias for System.Collections.List<'T> as ResizeArray<'T>.
let names = ResizeArray<string>()
names.Add "Bruce"
names.Add "Alfred"
names.Add "Tim"
names.Add "Richard"
let print s = printfn "%s" s
// Display the contents of the list using the print function.
names.ForEach(Action<string> print)
// The following demonstrates the lambda expression feature of F#
// to display the contents of the list to the console.
names.ForEach(fun s -> printfn "%s" 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 コンストラクト。また、無視される値を返すメソッドを指定することもできます)。通常、このようなメソッドは操作を実行するために使用されます。
注
1 つのパラメーターを持ち、値を返すメソッドを参照するには、代わりにジェネリック Func<T,TResult> デリゲートを使用します。
Action<T> デリゲートを使用する場合、メソッドを 1 つのパラメーターでカプセル化するデリゲートを明示的に定義する必要はありません。 たとえば、次のコードでは、 DisplayMessage という名前のデリゲートを明示的に宣言し、 WriteLine メソッドまたは ShowWindowsMessage メソッドへの参照をデリゲート インスタンスに割り当てます。
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);
}
}
open System
open System.Windows.Forms
type DisplayMessage = delegate of message: string -> unit
let showWindowsMessage message =
MessageBox.Show message |> ignore
let messageTarget =
DisplayMessage(
if Environment.GetCommandLineArgs().Length > 1 then
showWindowsMessage
else
printfn "%s"
)
messageTarget.Invoke "Hello, World!"
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;
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);
}
}
open System
open System.Windows.Forms
let showWindowsMessage message =
MessageBox.Show message |> ignore
let messageTarget =
Action<string>(
if Environment.GetCommandLineArgs().Length > 1 then
showWindowsMessage
else
printfn "%s"
)
messageTarget.Invoke "Hello, World!"
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
次の例に示すように、C# の匿名メソッドで Action<T> デリゲートを使用することもできます。 (匿名メソッドの概要については、「 匿名メソッド」を参照してください)。
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);
}
}
open System
open System.Windows.Forms
let showWindowsMessage message =
MessageBox.Show message |> ignore
let messageTarget =
Action<string>(
if Environment.GetCommandLineArgs().Length > 1 then
fun s -> showWindowsMessage s
else
fun s -> printfn "%s" s
)
messageTarget.Invoke "Hello, World!"
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) |
指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。 |