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<T>

 

Data di pubblicazione: ottobre 2016

Incapsula un metodo che ha un unico parametro e non restituisce alcun valore.

Per esaminare il codice sorgente di .NET Framework per questo tipo, vedere il Reference Source.

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

public delegate void Action<in T>(
	T obj
)

Parametri

obj
Type: T

Parametro del metodo incapsulato da questo delegato.

Parametri tipo

inT

Tipo del parametro del metodo incapsulato da questo delegato.

System_CAPS_noteNota

Per visualizzare il codice sorgente di .NET Framework per questo tipo, vedere il Reference Source. È possibile esplorare il codice sorgente online, scaricare i riferimenti per la visualizzazione offline e scorrere le origini (inclusi aggiornamenti e patch) durante l'esecuzione del debug. see instructions.

È possibile utilizzare il Action<T> 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 un parametro che viene passato 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 un parametro e restituisce un valore, utilizzare il metodo generico Func<T, TResult> delegato.

Quando si utilizza il Action<T> delegato, non è necessario definire in modo esplicito un delegato che incapsula un metodo con un singolo parametro. Ad esempio, il codice seguente dichiara in modo esplicito un delegato denominato DisplayMessage e assegna un riferimento a uno di WriteLine metodo o ShowWindowsMessage metodo all'istanza di delegato.

using System;
using System.Windows.Forms;

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

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

using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

È inoltre possibile utilizzare il Action<T> 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.Windows.Forms;

public class TestAnonMethod
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = delegate(string s) { ShowWindowsMessage(s); };
      else
         messageTarget = delegate(string s) { Console.WriteLine(s); };

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

È inoltre possibile assegnare un'espressione lambda a un Action<T> 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.Windows.Forms;

public class TestLambdaExpression
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = s => ShowWindowsMessage(s); 
      else
         messageTarget = s => Console.WriteLine(s);

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

Il ForEach e ForEach<T> ogni metodi accettano un Action<T> delegato come parametro. Il metodo incapsulato dal delegato consente di eseguire un'azione su ogni elemento nella matrice o elenco. Nell'esempio viene utilizzato il ForEach metodo per fornire un'illustrazione.

Nell'esempio seguente viene illustrato l'utilizzo del Action<T> delegato per stampare il contenuto di un List<T> oggetto. In questo esempio, il Print consente di visualizzare il contenuto dell'elenco nella console. Inoltre, nell'esempio c# viene inoltre illustrato l'utilizzo di metodi anonimi per visualizzare il contenuto nella console. Si noti che nell'esempio viene dichiarata in modo esplicito un Action<T> variabile. Al contrario, viene passato un riferimento a un metodo che accetta un singolo parametro e che non restituisce un valore per il List<T>.ForEach metodo, di cui l'unico parametro è un Action<T> delegato. Analogamente, nell'esempio di c#, un Action<T> delegato non viene creato in modo esplicito perché la firma del metodo anonimo corrisponde alla firma del Action<T> delegato che prevede il List<T>.ForEach (metodo).

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<String> names = new List<String>();
        names.Add("Bruce");
        names.Add("Alfred");
        names.Add("Tim");
        names.Add("Richard");

        // Display the contents of the list using the Print method.
        names.ForEach(Print);

        // The following demonstrates the anonymous method feature of C#
        // to display the contents of the list to the console.
        names.ForEach(delegate(String name)
        {
            Console.WriteLine(name);
        });
    }

    private static void Print(string s)
    {
        Console.WriteLine(s);
    }
}
/* This code will produce output similar to the following:
 * Bruce
 * Alfred
 * Tim
 * Richard
 * Bruce
 * Alfred
 * Tim
 * Richard
 */

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 2.0
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: