Action(T1, T2) Delegato
TOC
Comprimi il sommario
Espandi il sommario
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>

 

Incapsula un metodo che ha 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

Primo parametro del metodo incapsulato da questo delegato.

arg2

Secondo parametro del metodo incapsulato da questo delegato.

Parametri di tipo

T1

Tipo del primo parametro del metodo incapsulato da questo delegato.

T2

Tipo del secondo parametro del metodo incapsulato da questo delegato.

È possibile utilizzare il delegato Action<T1, T2> per passare un metodo come parametro senza dichiarare in modo esplicito un delegato personalizzato. Il metodo incapsulato deve corrispondere alla firma del metodo che viene definita da questo delegato. In questo modo, il metodo incapsulato deve disporre di due parametri, entrambi passati al metodo tramite il valore, e non deve restituire alcun valore. In C#, il metodo deve restituire void. In Visual Basic, deve essere definito dal costrutto SubEnd Sub. Può anche essere un metodo che restituisce un valore che viene ignorato). Questo tipo di metodo viene utilizzato in genere per eseguire un'operazione.

System_CAPS_noteNota

Per fare riferimento a un metodo con due parametri e che restituisce un valore, utilizzare, invece, il delegato generico Func<T1, T2, TResult>.

Quando si utilizza il delegato Action<T1, T2>, 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. Quindi assegna un riferimento ad uno dei due metodi alla relativa istanza del delegato. Un metodo scrive due stringhe sulla 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();
      }      
   }
}

L'esempio seguente semplifica questo codice creando un'istanza del delegato Action<T1, T2> anziché definire in modo esplicito un nuovo delegato e assegnargli un metodo denominato.

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 delegato Action<T1, T2> con i metodi anonimi di C#, come illustrato nell'esempio riportato di seguito. Per un'introduzione ai metodi anonimi, vedere Anonymous Methods (C# Programming Guide).

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'istanza del delegato Action<T1, T2>, come illustrato nell'esempio riportato di seguito. 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 4.5
.NET Framework
Disponibile da 3.5
Portable Class Library
Supportato in: portable .NET platforms
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra:
© 2016 Microsoft