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>

 

Data di pubblicazione: ottobre 2016

Incapsula un metodo che presenta due parametri e non restituisce alcun valore.

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

public delegate void Action<in T1, in T2>(
	T1 arg1,
	T2 arg2
)

Parametri

arg1
Type: T1

Primo parametro del metodo incapsulato da questo delegato.

arg2
Type: T2

Secondo 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.

È possibile utilizzare il Action<T1, T2> 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 due parametri che sono entrambi 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 due parametri e restituisce un valore, utilizzare il metodo generico Func<T1, T2, TResult> delegato.

Quando si utilizza il Action<T1, T2> delegato, non è necessario definire in modo esplicito un delegato che incapsula un metodo con due parametri. Ad esempio, il codice seguente dichiara in modo esplicito un delegato denominato ConcatStrings. Assegna un riferimento a uno dei due metodi per l'istanza di delegato. Un metodo scrive due stringhe nella console. il secondo scrive due stringhe in un file.

using System;
using System.IO;

delegate void ConcatStrings(string string1, string string2);

public class TestDelegate
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      ConcatStrings concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = WriteToFile;
      else
         concat = WriteToConsole;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}

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

using System;
using System.IO;

public class TestAction2
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = WriteToFile;
      else
         concat = WriteToConsole;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}

È inoltre possibile utilizzare il Action<T1, T2> 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;
using System.IO;

public class TestAnonymousMethod
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = delegate(string s1, string s2) { WriteToFile(s1, s2); };
      else
         concat = delegate(string s1, string s2) { WriteToConsole(s1, s2);} ;

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}

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

using System;
using System.IO;

public class TestLambdaExpression
{
   public static void Main()
   {
      string message1 = "The first line of a message.";
      string message2 = "The second line of a message.";
      Action<string, string> concat;

      if (Environment.GetCommandLineArgs().Length > 1)
         concat = (s1, s2) => WriteToFile(s1, s2);
      else
         concat = (s1, s2) => WriteToConsole(s1, s2);

      concat(message1, message2);
   }

   private static void WriteToConsole(string string1, string string2)
   {
      Console.WriteLine("{0}\n{1}", string1, string2);            
   }

   private static void WriteToFile(string string1, string string2)
   {
      StreamWriter writer = null;  
      try
      {
         writer = new StreamWriter(Environment.GetCommandLineArgs()[1], false);
         writer.WriteLine("{0}\n{1}", string1, string2);
      }
      catch
      {
         Console.WriteLine("File write operation failed...");
      }
      finally
      {
         if (writer != null) writer.Close();
      }      
   }
}

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: