Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Delegato Action<T1, T2, T3, T4>

 

Data di pubblicazione: novembre 2016

Incapsula un metodo che ha quattro parametri e non restituisce alcun valore.

Spazio dei nomi:   System
Assembly:  mscorlib (in mscorlib.dll)

public delegate void Action<in T1, in T2, in T3, in T4>(
	T1 arg1,
	T2 arg2,
	T3 arg3,
	T4 arg4
)

Parametri

arg1
Type: T1

Primo parametro del metodo incapsulato da questo delegato.

arg2
Type: T2

Secondo parametro del metodo incapsulato da questo delegato.

arg3
Type: T3

Terzo parametro del metodo incapsulato da questo delegato.

arg4
Type: T4

Quarto parametro del metodo incapsulato da questo delegato.

Parametri tipo

inT1

Tipo del primo parametro del metodo incapsulato da questo delegato.

inT2

Tipo del secondo parametro del metodo incapsulato da questo delegato.

inT3

Tipo del terzo parametro del metodo incapsulato da questo delegato.

inT4

Tipo del quarto parametro del metodo incapsulato da questo delegato.

È possibile utilizzare la Action<T1, T2, T3, T4> delegato per passare un metodo come un parametro senza dichiarare in modo esplicito un delegato personalizzato. Il metodo incapsulato deve corrispondere alla firma del metodo che è definita da questo delegato. Ciò significa che il metodo incapsulato deve avere quattro parametri che sono tutti passati per valore e non deve essere restituito un valore. (In c#, il metodo deve restituire void. In Visual Basic, devono essere definito dal Sub... End Sub costruire. Può essere anche un metodo che restituisce un valore che viene ignorato.) In genere, questo metodo viene utilizzato per eseguire un'operazione.

System_CAPS_noteNota

Per fare riferimento a un metodo che presenta quattro parametri e restituisce un valore, utilizzare il metodo generico Func<T1, T2, T3, T4, TResult> delegato.

Quando si utilizza 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 di CopyStrings metodo all'istanza di 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);
      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]);
   }
}

Nell'esempio seguente viene semplificato questo codice creando il Action<T1, T2, T3, T4> delegato anziché la definizione di un nuovo delegato e assegnarle un metodo denominato in modo esplicito.

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]);
   }
}

È inoltre possibile utilizzare il Action<T1, T2, T3, T4> delegato con i metodi anonimi in c#, come illustrato nell'esempio seguente. (Per un'introduzione ai metodi anonimi, vedere Metodi anonimi (Guida per programmatori C#).)

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]);
   }
}

È inoltre possibile assegnare un'espressione lambda a un Action<T1, T2, T3, T4> delegato di istanza, come illustrato nell'esempio seguente. (Per un'introduzione alle espressioni lambda, vedere Espressioni lambda (Guida per programmatori C#).)

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]);
   }
}

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 3.5
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: