Esporta (0) Stampa
Espandi tutto
Espandi Riduci a icona
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Delegato Action<T>

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

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

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

Parametri di tipo

in T

Il tipo del parametro del metodo che questo delegato incapsula.

Il parametro di questo tipo è controvariante. Ciò significa che è possibile utilizzare il tipo specificato o qualsiasi tipo meno derivato. Per ulteriori informazioni sulla covarianza e la controvarianza, vedere Covarianza e controvarianza nei generics.

Parametri

obj
Tipo: T
Il parametro del metodo che questo delegato incapsula.

È possibile utilizzare il delegato Action<T> 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. Ciò significa che il metodo incapsulato deve avere un parametro che gli viene passato per valore e non deve restituire un 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.

NotaNota

Per fare riferimento a un metodo con un parametro e che restituisce un valore, si deve, invece, utilizzare il delegato generico Func<T, TResult>.

Quando si utilizza il delegato Action<T>, 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 al metodo WriteLine o al metodo ShowWindowsMessage alla relativa istanza del 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);      
   }
}


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


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 delegato Action<T> con metodi anonimi in C#, come 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);      
   }
}


È anche possibile assegnare un'espressione lambda ad un'istanza del delegato Action<T>, come 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);      
   }
}


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

Nell'esempio seguente viene illustrato l'utilizzo del delegato Action<T> per stampare il contenuto di un oggetto List<T>. in questo esempio, il metodo Print viene utilizzato per visualizzare il contenuto dell'elenco nella console. Inoltre, l'esempio in C# illustra l'utilizzo dei metodi anonimi per visualizzare i contenuti nella console. Si noti che nell'esempio non viene dichiarata in modo esplicito una variabile di tipo Action<T>. Invece, viene passato un riferimento a un metodo che accetta un singolo parametro e che non restituisce un valore al metodo List<T>.ForEach, il cui unico parametro è un delegato Action<T>. Analogamente, nell'esempio in c#, Action<T> il delegato in modo esplicito non viene creata un'istanza perché la firma del metodo anonimo corrisponde alla firma di Action<T> delegare previsto da 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
 */


.NET Framework

Supportato in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

.NET per applicazioni Windows Phone

Supportato in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft