Updated: February 2009
Encapsulates a method that takes three parameters and does not return a value.
Namespace:
System
Assembly:
System.Core (in System.Core.dll)
'Usage
Dim instance As New Action(Of T1, T2, T3)(AddressOf HandlerMethod)
'Declaration
Public Delegate Sub Action(Of T1, T2, T3) ( _
arg1 As T1, _
arg2 As T2, _
arg3 As T3 _
)
Type Parameters
- T1
The type of the first parameter of the method that this delegate encapsulates.
- T2
The type of the second parameter of the method that this delegate encapsulates.
- T3
The type of the third parameter of the method that this delegate encapsulates.
Parameters
- arg1
- Type: T1
The first parameter of the method that this delegate encapsulates.
- arg2
- Type: T2
The second parameter of the method that this delegate encapsulates.
- arg3
- Type: T3
The third parameter of the method that this delegate encapsulates.
You can use the Action<(Of <(T1, T2, T3>)>) delegate to pass a method as a parameter without explicitly declaring a custom delegate. The method must correspond to the method signature that is defined by this delegate. This means that the encapsulated method must have three parameters that are all passed to it by value, and it must not return a value. (In C#, the method must return void. In Visual Basic, it must be defined by the Sub…End Sub construct.) Typically, such a method is used to perform an operation.
When you use the Action<(Of <(T1, T2, T3>)>) delegate, you do not have to explicitly define a delegate that encapsulates a method with three parameters. For example, the following code explicitly declares a delegate named StringCopy and assigns a reference to the CopyStrings method to its delegate instance.
Delegate Sub StringCopy(stringArray1() As String, _
stringArray2() As String, _
indexToStart As Integer)
Module TestDelegate
Public Sub Main()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As StringCopy = AddressOf CopyStrings
copyOperation(ordinals, copiedOrdinals, 3)
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)
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 source.Length - 1
target(ctr) = String.Copy(source(ctr))
Next
End Sub
End Module
The following example simplifies this code by instantiating the Action<(Of <(T1, T2, T3>)>) delegate rather than explicitly defining a new delegate and assigning a named method to it.
Module TestAction3
Public Sub Main()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As Action(Of String(), String(), Integer) = AddressOf CopyStrings
copyOperation(ordinals, copiedOrdinals, 3)
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)
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 source.Length - 1
target(ctr) = String.Copy(source(ctr))
Next
End Sub
End Module
You can also use the Action<(Of <(T1, T2, T3>)>) delegate with anonymous methods in C#, as the following example illustrates. (For an introduction to anonymous methods, see Anonymous Methods (C# Programming Guide).)
using System;
public class TestAnon
{
public static void Main()
{
string[] ordinals = {"First", "Second", "Third", "Fourth", "Fifth"};
string[] copiedOrdinals = new string[ordinals.Length];
Action<string[], string[], int> copyOperation = delegate(string[] s1,
string[] s2,
int pos)
{ CopyStrings(s1, s2, pos); };
copyOperation(ordinals, copiedOrdinals, 3);
foreach (string ordinal in copiedOrdinals)
Console.WriteLine(String.IsNullOrEmpty(ordinal) ? "<None>" : ordinal);
}
private static void CopyStrings(string[] source, string[] target, int startPos)
{
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 <= source.Length - 1; ctr++)
target[ctr] = String.Copy(source[ctr]);
}
}
You can also assign a lambda expression to an Action<(Of <(T1, T2, T3>)>) delegate instance, as the following example illustrates. (For an introduction to lambda expressions, see Lambda Expressions (C# Programming Guide).)
Public Module TestLambda
Public Sub Main()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As Action(Of String(), String(), Integer) = _
Function(s1, s2, pos) CopyStrings(s1, s2, pos)
copyOperation(ordinals, copiedOrdinals, 3)
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) 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 source.Length - 1
target(ctr) = String.Copy(source(ctr))
Next
Return source.Length - startPos
End Function
End Module
' The example displays the following output:
' <None>
' <None>
' <None>
' Fourth
' Fifth
Note: |
|---|
Visual Basic requires that a lambda expression return a value. As a result, that return value must be discarded if the lambda expression is to be used with the Action<(Of <(T1, T2, T3>)>) delegate. |
Windows 7, Windows Vista, Windows XP SP2, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360, Zune
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
.NET Framework
Supported in: 3.5
.NET Compact Framework
Supported in: 3.5
XNA Framework
Supported in: 3.0
Reference
Date | History | Reason |
|---|
February 2009
| Modified the note about lambda expressions in Visual Basic, and added a Visual Basic example that uses a lambda expression. |
Customer feedback.
|