Action<T1,T2,T3,T4> 代理人
定義
4 個のパラメーターを持ち、値を返さないメソッドをカプセル化します。Encapsulates a method that has four parameters and does not return a value.
generic <typename T1, typename T2, typename T3, typename T4>
public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public delegate void Action<in T1,in T2,in T3,in T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public delegate void Action<T1,T2,T3,T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
type Action<'T1, 'T2, 'T3, 'T4> = delegate of 'T1 * 'T2 * 'T3 * 'T4 -> unit
Public Delegate Sub Action(Of In T1, In T2, In T3, In T4)(arg1 As T1, arg2 As T2, arg3 As T3, arg4 As T4)
Public Delegate Sub Action(Of T1, T2, T3, T4)(arg1 As T1, arg2 As T2, arg3 As T3, arg4 As T4)
型パラメーター
- T1
このデリゲートによってカプセル化されるメソッドの最初のパラメーターの型。The type of the first parameter of the method that this delegate encapsulates.
この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。- T2
このデリゲートによってカプセル化されるメソッドの 2 番目のパラメーターの型。The type of the second parameter of the method that this delegate encapsulates.
この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。- T3
このデリゲートによってカプセル化されるメソッドの 3 番目のパラメーターの型。The type of the third parameter of the method that this delegate encapsulates.
この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。- T4
このデリゲートによってカプセル化されるメソッドの 4 番目のパラメーターの型。The type of the fourth parameter of the method that this delegate encapsulates.
この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。パラメーター
- arg1
- T1
このデリゲートによってカプセル化されるメソッドの最初のパラメーター。The first parameter of the method that this delegate encapsulates.
- arg2
- T2
このデリゲートによってカプセル化されるメソッドの 2 番目のパラメーター。The second parameter of the method that this delegate encapsulates.
- arg3
- T3
このデリゲートによってカプセル化されるメソッドの 3 番目のパラメーター。The third parameter of the method that this delegate encapsulates.
- arg4
- T4
このデリゲートによってカプセル化されるメソッドの 4 番目のパラメーター。The fourth parameter of the method that this delegate encapsulates.
注釈
デリゲートを使用すると、 Action<T1,T2,T3,T4> カスタムデリゲートを明示的に宣言せずに、メソッドをパラメーターとして渡すことができます。You can use the Action<T1,T2,T3,T4> delegate to pass a method as a parameter without explicitly declaring a custom delegate. カプセル化されたメソッドは、このデリゲートで定義されているメソッドシグネチャに対応している必要があります。The encapsulated method must correspond to the method signature that is defined by this delegate. つまり、カプセル化されたメソッドには、すべて値によって渡される4つのパラメーターが必要であり、値を返さないようにする必要があります。This means that the encapsulated method must have four parameters that are all passed to it by value, and it must not return a value. (C# では、メソッドはを返す必要があり void
ます。(In C#, the method must return void
. Visual Basic では、これを定義する必要があります.. Sub
.End Sub
In Visual Basic, it must be defined by the Sub
…End Sub
construct。construct. また、無視される値を返すメソッドを指定することもできます)。通常、このようなメソッドは、操作を実行するために使用されます。It can also be a method that returns a value that is ignored.) Typically, such a method is used to perform an operation.
注意
4つのパラメーターを持ち、値を返すメソッドを参照するには、代わりに汎用デリゲートを使用し Func<T1,T2,T3,T4,TResult> ます。To reference a method that has four parameters and returns a value, use the generic Func<T1,T2,T3,T4,TResult> delegate instead.
デリゲートを使用する場合は Action<T1,T2,T3,T4> 、4つのパラメーターを持つメソッドをカプセル化するデリゲートを明示的に定義する必要はありません。When you use the Action<T1,T2,T3,T4> delegate, you do not have to explicitly define a delegate that encapsulates a method with four parameters. たとえば、次のコードでは、という名前のデリゲートを明示的に宣言 StringCopy
し、メソッドへの参照を CopyStrings
そのデリゲートインスタンスに割り当てます。For example, the following code explicitly declares a delegate named StringCopy
and assigns a reference to the CopyStrings
method to its delegate instance.
using System;
delegate void StringCopy(string[] stringArray1,
string[] stringArray2,
int indexToStart,
int numberToCopy);
public class TestDelegate
{
public static void Main()
{
string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth",
"Sixth", "Seventh", "Eighth", "Ninth", "Tenth"};
string[] copiedOrdinals = new string[ordinals.Length];
StringCopy copyOperation = CopyStrings;
copyOperation(ordinals, copiedOrdinals, 3, 5);
foreach (string ordinal in copiedOrdinals)
Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
}
private static void CopyStrings(string[] source, string[] target,
int startPos, int number)
{
if (source.Length != target.Length)
throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");
for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
target[ctr] = String.Copy(source[ctr]);
}
}
Delegate Sub StringCopy(stringArray1() As String, _
stringArray2() As String, _
indexToStart As Integer, _
numberToCopy As Integer)
Module TestDelegate
Public Sub Main()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", _
"Fifth", "Sixth", "Seventh", "Eighth", _
"Ninth", "Tenth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As StringCopy = AddressOf CopyStrings
copyOperation(ordinals, copiedOrdinals, 3, 5)
For Each ordinal As String In copiedOrdinals
Console.WriteLine(ordinal)
Next
End Sub
Private Sub CopyStrings(source() As String, target() As String, _
startPos As Integer, number As Integer)
If source.Length <> target.Length Then
Throw New IndexOutOfRangeException("The source and target arrays" & _
" must have the same number of elements.")
End If
For ctr As Integer = startPos to startpos + number - 1
target(ctr) = String.Copy(source(ctr))
Next
End Sub
End Module
次の例では、 Action<T1,T2,T3,T4> 新しいデリゲートを明示的に定義し、名前付きメソッドを割り当てるのではなく、デリゲートをインスタンス化することによって、このコードを簡略化します。The following example simplifies this code by instantiating the Action<T1,T2,T3,T4> delegate instead of explicitly defining a new delegate and assigning a named method to it.
using System;
public class TestAction4
{
public static void Main()
{
string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth",
"Sixth", "Seventh", "Eighth", "Ninth", "Tenth"};
string[] copiedOrdinals = new string[ordinals.Length];
Action<string[], string[], int, int> copyOperation = CopyStrings;
copyOperation(ordinals, copiedOrdinals, 3, 5);
foreach (string ordinal in copiedOrdinals)
Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
}
private static void CopyStrings(string[] source, string[] target,
int startPos, int number)
{
if (source.Length != target.Length)
throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");
for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
target[ctr] = String.Copy(source[ctr]);
}
}
Module TestAction4
Public Sub Main()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", _
"Fifth", "Sixth", "Seventh", "Eighth", _
"Ninth", "Tenth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As Action(Of String(), String(), Integer, Integer) = _
AddressOf CopyStrings
copyOperation(ordinals, copiedOrdinals, 3, 5)
For Each ordinal As String In copiedOrdinals
Console.WriteLine(ordinal)
Next
End Sub
Private Sub CopyStrings(source() As String, target() As String, _
startPos As Integer, number As Integer)
If source.Length <> target.Length Then
Throw New IndexOutOfRangeException("The source and target arrays" & _
" must have the same number of elements.")
End If
For ctr As Integer = startPos to startpos + number - 1
target(ctr) = String.Copy(source(ctr))
Next
End Sub
End Module
Action<T1,T2,T3,T4>次の例に示すように、C# では、匿名メソッドでデリゲートを使用することもできます。You can also use the Action<T1,T2,T3,T4> delegate with anonymous methods in C#, as the following example illustrates. (匿名メソッドの概要については、「 匿名メソッド」を参照してください)。(For an introduction to anonymous methods, see Anonymous Methods.)
using System;
public class TestAnonymousMethod
{
public static void Main()
{
string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth",
"Sixth", "Seventh", "Eighth", "Ninth", "Tenth"};
string[] copiedOrdinals = new string[ordinals.Length];
Action<string[], string[], int, int> copyOperation =
delegate(string[] s1, string[] s2,
int pos, int num)
{ CopyStrings(s1, s2, pos, num); };
copyOperation(ordinals, copiedOrdinals, 3, 5);
foreach (string ordinal in copiedOrdinals)
Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
}
private static void CopyStrings(string[] source, string[] target,
int startPos, int number)
{
if (source.Length != target.Length)
throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");
for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
target[ctr] = String.Copy(source[ctr]);
}
}
次の例に示すように、ラムダ式をデリゲートインスタンスに割り当てることもでき Action<T1,T2,T3,T4> ます。You can also assign a lambda expression to an Action<T1,T2,T3,T4> delegate instance, as the following example illustrates. (ラムダ式の概要については、「 ラムダ式」を参照してください)。(For an introduction to lambda expressions, see Lambda Expressions.)
using System;
public class TestLambdaExpression
{
public static void Main()
{
string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth",
"Sixth", "Seventh", "Eighth", "Ninth", "Tenth"};
string[] copiedOrdinals = new string[ordinals.Length];
Action<string[], string[], int, int> copyOperation = (s1, s2, pos, num)
=> CopyStrings(s1, s2, pos, num);
copyOperation(ordinals, copiedOrdinals, 3, 5);
foreach (string ordinal in copiedOrdinals)
Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
}
private static void CopyStrings(string[] source, string[] target,
int startPos, int number)
{
if (source.Length != target.Length)
throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.");
for (int ctr = startPos; ctr <= startPos + number - 1; ctr++)
target[ctr] = String.Copy(source[ctr]);
}
}
Public Module TestLambdaExpression
Public Sub Main()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth", _
"Sixth", "Seventh", "Eighth", "Ninth", "Tenth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As Action(Of String(), String(), Integer, Integer) = _
Sub(s1, s2, pos, num) CopyStrings(s1, s2, pos, num)
copyOperation(ordinals, copiedOrdinals, 3, 5)
For Each ordinal As String In copiedOrdinals
If String.IsNullOrEmpty(ordinal) Then
Console.WriteLine("<None>")
Else
Console.WriteLine(ordinal)
End If
Next
End Sub
Private Function CopyStrings(source() As String, target() As String, _
startPos As Integer, number As Integer) As Integer
If source.Length <> target.Length Then
throw new IndexOutOfRangeException("The source and target arrays must have the same number of elements.")
End If
For ctr As Integer = startPos To startPos + number - 1
target(ctr) = String.Copy(source(ctr))
Next
Return number
End Function
End Module
' The example displays the following output:
' Fourth
' Fifth
' Sixth
' Seventh
' Eighth
拡張メソッド
GetMethodInfo(Delegate) |
指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。Gets an object that represents the method represented by the specified delegate. |