Action<T1,T2,T3> Delegado
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Encapsula un método que tiene tres parámetros y no devuelve un valor.
generic <typename T1, typename T2, typename T3>
public delegate void Action(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<in T1,in T2,in T3>(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3);
type Action<'T1, 'T2, 'T3> = delegate of 'T1 * 'T2 * 'T3 -> unit
Public Delegate Sub Action(Of In T1, In T2, In T3)(arg1 As T1, arg2 As T2, arg3 As T3)
Public Delegate Sub Action(Of T1, T2, T3)(arg1 As T1, arg2 As T2, arg3 As T3)
Parámetros de tipo
- T1
Tipo del primer parámetro del método que este delegado encapsula.
Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.- T2
Tipo del segundo parámetro del método que encapsula este delegado.
Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.- T3
Tipo del tercer parámetro del método que este delegado encapsula.
Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.Parámetros
- arg1
- T1
Primer parámetro del método que este delegado encapsula.
- arg2
- T2
Segundo parámetro del método que este delegado encapsula.
- arg3
- T3
Tercer parámetro del método que este delegado encapsula.
Comentarios
Puede usar el delegado de Action<T1,T2,T3> para pasar un método como parámetro sin declarar explícitamente un delegado personalizado. El método encapsulado debe corresponder a la firma del método definida por este delegado. Esto significa que el método encapsulado debe tener tres parámetros que se le pasan por valor y no debe devolver un valor. (En C#, el método debe devolver void
. En F#, el método o la función deben devolver la unidad. En Visual Basic, debe definirse mediante la construcción Sub
...End Sub
. También puede ser un método que devuelve un valor que se omite). Normalmente, este método se usa para realizar una operación.
Nota
Para hacer referencia a un método que tiene tres parámetros y devuelve un valor, use el delegado genérico Func<T1,T2,T3,TResult> en su lugar.
Cuando se usa el delegado de Action<T1,T2,T3>, no es necesario definir explícitamente un delegado que encapsula un método con tres parámetros. Por ejemplo, el código siguiente declara explícitamente un delegado denominado StringCopy
y asigna una referencia al método CopyStrings
a su instancia de delegado.
using System;
delegate void StringCopy(string[] stringArray1,
string[] stringArray2,
int indexToStart);
public class TestDelegate
{
public static void Main()
{
string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
string[] copiedOrdinals = new string[ordinals.Length];
StringCopy copyOperation = CopyStrings;
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] = source[ctr];
}
}
open System
type StringCopy = delegate of stringArray1: string [] *
stringArray2: string [] *
indexToStart: int -> unit
let copyStrings (source: string []) (target: string []) startPos =
if source.Length <> target.Length then
raise (IndexOutOfRangeException "The source and target arrays must have the same number of elements.")
for i = startPos to source.Length - 1 do
target.[i] <- source.[i]
let ordinals = [| "First"; "Second"; "Third"; "Fourth"; "Fifth" |]
let copiedOrdinals: string [] = Array.zeroCreate ordinals.Length
let copyOperation = StringCopy copyStrings
copyOperation.Invoke(ordinals, copiedOrdinals, 3)
for ordinal in copiedOrdinals do
printfn "%s" (if String.IsNullOrEmpty ordinal then "<None>" else ordinal)
Delegate Sub StringCopy(stringArray1() As String,
stringArray2() As String,
indexToStart As Integer)
Module TestDelegate
Public Sub RunIt()
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
If String.IsNullOrEmpty(ordinal) Then
Console.WriteLine("<None>")
Else
Console.WriteLine(ordinal)
End If
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) = source(ctr)
Next
End Sub
End Module
En el ejemplo siguiente se simplifica este código mediante la creación de instancias del delegado de Action<T1,T2,T3> en lugar de definir explícitamente un nuevo delegado y asignarle un método con nombre.
using System;
public class TestAction3
{
public static void Main()
{
string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
string[] copiedOrdinals = new string[ordinals.Length];
Action<string[], string[], int> copyOperation = CopyStrings;
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] = source[ctr];
}
}
open System
let copyStrings (source: string []) (target: string []) startPos =
if source.Length <> target.Length then
raise (IndexOutOfRangeException "The source and target arrays must have the same number of elements.")
for i = startPos to source.Length - 1 do
target.[i] <- source.[i]
let ordinals = [| "First"; "Second"; "Third"; "Fourth"; "Fifth" |]
let copiedOrdinals = Array.zeroCreate<string> ordinals.Length
let copyOperation = Action<_,_,_> copyStrings
copyOperation.Invoke(ordinals, copiedOrdinals, 3)
for ordinal in copiedOrdinals do
printfn "%s" (if String.IsNullOrEmpty ordinal then "<None>" else ordinal)
Module TestAction3
Public Sub RunIt()
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
If String.IsNullOrEmpty(ordinal) Then
Console.WriteLine("<None>")
Else
Console.WriteLine(ordinal)
End If
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) = source(ctr)
Next
End Sub
End Module
También puede usar el delegado de Action<T1,T2,T3> con métodos anónimos en C#, como se muestra en el ejemplo siguiente. (Para obtener una introducción a los métodos anónimos, consulte Métodos anónimos).
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] = source[ctr];
}
}
También puede asignar una expresión lambda a una instancia de delegado de Action<T1,T2,T3>, como se muestra en el ejemplo siguiente. (Para obtener una introducción a las expresiones lambda, vea expresiones lambda (C#) o expresiones lambda de (F#)).
using System;
public class TestLambda
{
public static void Main()
{
string[] ordinals = ["First", "Second", "Third", "Fourth", "Fifth"];
string[] copiedOrdinals = new string[ordinals.Length];
Action<string[], string[], int> copyOperation = (s1, s2, 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] = source[ctr];
}
}
open System
let copyStrings (source: string []) (target: string []) startPos =
if source.Length <> target.Length then
raise (IndexOutOfRangeException "The source and target arrays must have the same number of elements.")
for i = startPos to source.Length - 1 do
target.[i] <- source.[i]
let ordinals = [| "First"; "Second"; "Third"; "Fourth"; "Fifth" |]
let copiedOrdinals: string [] = Array.zeroCreate ordinals.Length
let copyOperation = Action<_,_,_> (fun s1 s2 pos -> copyStrings s1 s2 pos)
copyOperation.Invoke(ordinals, copiedOrdinals, 3)
for ordinal in copiedOrdinals do
printfn "%s" (if String.IsNullOrEmpty ordinal then "<None>" else ordinal)
Public Module TestLambda
Public Sub RunIt()
Dim ordinals() As String = {"First", "Second", "Third", "Fourth", "Fifth"}
Dim copiedOrdinals(ordinals.Length - 1) As String
Dim copyOperation As Action(Of String(), String(), Integer) =
Sub(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) = source(ctr)
Next
Return source.Length - startPos
End Function
End Module
' The example displays the following output:
' Fourth
' Fifth
Métodos de extensión
GetMethodInfo(Delegate) |
Obtiene un objeto que representa el método representado por el delegado especificado. |