Action<T1,T2,T3,T4> Delegato
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Incapsula un metodo che presenta quattro parametri e non restituisce alcun valore.
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)
Parametri di tipo
- T1
Tipo del primo parametro del metodo incapsulato da questo delegato.
Questo parametro di tipo è controvariante, ovvero puoi usare il tipo specificato o qualsiasi tipo meno derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.- T2
Tipo del secondo parametro del metodo incapsulato da questo delegato.
Questo parametro di tipo è controvariante, ovvero puoi usare il tipo specificato o qualsiasi tipo meno derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.- T3
Tipo del terzo parametro del metodo incapsulato da questo delegato.
Questo parametro di tipo è controvariante, ovvero puoi usare il tipo specificato o qualsiasi tipo meno derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.- T4
Tipo del quarto parametro del metodo incapsulato da questo delegato.
Questo parametro di tipo è controvariante, ovvero puoi usare il tipo specificato o qualsiasi tipo meno derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.Parametri
- arg1
- T1
Primo parametro del metodo incapsulato da questo delegato.
- arg2
- T2
Secondo parametro del metodo incapsulato da questo delegato.
- arg3
- T3
Terzo parametro del metodo incapsulato da questo delegato.
- arg4
- T4
Quarto parametro del metodo incapsulato da questo delegato.
Commenti
È possibile usare il Action<T1,T2,T3,T4> delegato per passare un metodo come parametro senza dichiarare esplicitamente un delegato personalizzato. Il metodo incapsulato deve corrispondere alla firma del metodo definita da questo delegato. Ciò significa che il metodo incapsulato deve avere quattro parametri che vengono tutti passati per valore e non deve restituire un valore. (In C#, il metodo deve restituire void
. In F# il metodo o la funzione deve restituire unità. In Visual Basic, deve essere definito dal costrutto Sub
...End Sub
. Può anche essere un metodo che restituisce un valore ignorato. In genere, tale metodo viene usato per eseguire un'operazione.
Nota
Per fare riferimento a un metodo con quattro parametri e restituisce un valore, usare invece il delegato generico Func<T1,T2,T3,T4,TResult> .
Quando si usa il Action<T1,T2,T3,T4> delegato, non è necessario definire in modo esplicito un delegato che incapsula un metodo con quattro parametri. Ad esempio, il codice seguente dichiara in modo esplicito un delegato denominato StringCopy
e assegna un riferimento al metodo all'istanza CopyStrings
del delegato.
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);
Console.WriteLine();
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] = source[ctr];
}
}
open System
type StringCopy = delegate of stringArray1: string [] *
stringArray2: string [] *
indexToStart: int *
numberToCopy: int -> unit
let copyStrings (source: string []) (target: string []) startPos number =
if source.Length <> target.Length then
raise (IndexOutOfRangeException "The source and target arrays must have the same number of elements.")
for i = startPos to startPos + number - 1 do
target.[i] <- source.[i]
let ordinals =
[| "First"; "Second"; "Third"; "Fourth"; "Fifth"
"Sixth"; "Seventh"; "Eighth"; "Ninth"; "Tenth" |]
let copiedOrdinals: string [] = Array.zeroCreate ordinals.Length
let copyOperation = StringCopy copyStrings
copyOperation.Invoke(ordinals, copiedOrdinals, 3, 5)
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, _
numberToCopy As Integer)
Module TestDelegate
Public Sub RunIt()
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)
Console.WriteLine()
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, 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) = source(ctr)
Next
End Sub
End Module
L'esempio seguente semplifica questo codice creando un'istanza del Action<T1,T2,T3,T4> delegato anziché definendo in modo esplicito un nuovo delegato e assegnando un metodo denominato.
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);
Console.WriteLine();
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] = source[ctr];
}
}
open System
let copyStrings (source: string []) (target: string []) startPos number =
if source.Length <> target.Length then
raise (IndexOutOfRangeException "The source and target arrays must have the same number of elements.")
for i = startPos to startPos + number - 1 do
target.[i] <- source.[i]
let ordinals =
[| "First"; "Second"; "Third"; "Fourth"; "Fifth"
"Sixth"; "Seventh"; "Eighth"; "Ninth"; "Tenth" |]
let copiedOrdinals: string [] = Array.zeroCreate ordinals.Length
let copyOperation = Action<_, _, _, _> copyStrings
copyOperation.Invoke(ordinals, copiedOrdinals, 3, 5)
for ordinal in copiedOrdinals do
printfn "%s" (if String.IsNullOrEmpty ordinal then "<None>" else ordinal)
Module TestAction4
Public Sub RunIt()
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)
Console.WriteLine()
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, 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) = source(ctr)
Next
End Sub
End Module
È anche possibile usare il Action<T1,T2,T3,T4> delegato con metodi anonimi in C#, come illustrato nell'esempio seguente. Per un'introduzione ai metodi anonimi, vedere Metodi anonimi.
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);
Console.WriteLine();
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] = source[ctr];
}
}
È anche possibile assegnare un'espressione lambda a un'istanza Action<T1,T2,T3,T4> del delegato, come illustrato nell'esempio seguente. Per un'introduzione alle espressioni lambda, vedere Espressioni lambda (C#) o Espressioni lambda (F#).)
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);
Console.WriteLine();
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] = source[ctr];
}
}
open System
let copyStrings (source: string []) (target: string []) startPos number =
if source.Length <> target.Length then
raise (IndexOutOfRangeException "The source and target arrays must have the same number of elements.")
for i = startPos to startPos + number - 1 do
target.[i] <- source.[i]
let ordinals =
[| "First"; "Second"; "Third"; "Fourth"; "Fifth"
"Sixth"; "Seventh"; "Eighth"; "Ninth"; "Tenth" |]
let copiedOrdinals: string [] = Array.zeroCreate ordinals.Length
let copyOperation = Action<_, _, _, _> (fun s1 s2 pos num -> copyStrings s1 s2 pos num)
copyOperation.Invoke(ordinals, copiedOrdinals, 3, 5)
for ordinal in copiedOrdinals do
printfn "%s" (if String.IsNullOrEmpty ordinal then "<None>" else ordinal)
Public Module TestLambdaExpression
Public Sub RunIt()
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)
Console.WriteLine()
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) = source(ctr)
Next
Return number
End Function
End Module
' The example displays the following output:
' Fourth
' Fifth
' Sixth
' Seventh
' Eighth
Metodi di estensione
GetMethodInfo(Delegate) |
Ottiene un oggetto che rappresenta il metodo rappresentato dal delegato specificato. |