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 Func<T1, T2, TResult>

 

Data di pubblicazione: ottobre 2016

Incapsula un metodo che presenta due parametri e restituisce un valore del tipo specificato dal parametro TResult.

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

public delegate TResult Func<in T1, in T2, out TResult>(
	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.

Valore restituito

Type: TResult

Valore restituito 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.

outTResult

Tipo del valore restituito del metodo incapsulato da questo delegato.

È possibile utilizzare questo delegato per rappresentare un metodo che può essere passato come parametro senza dichiarare in modo esplicito un delegato personalizzato. Il metodo incapsulato deve corrispondere alla firma del metodo definita da questo delegato. Ciò significa che il metodo incapsulato deve disporre di due parametri, ognuno dei quali viene passato al metodo per valore, e che deve restituire un valore.

System_CAPS_noteNota

Per fare riferimento a un metodo che presenta due parametri e restituisce void (o in Visual Basic, che è dichiarato come un Sub piuttosto che come un Function), utilizzare il metodo generico Action<T1, T2> delegato.

Quando si utilizza il Func<T1, T2, TResult> 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 ExtractMethod e assegna un riferimento per il ExtractWords metodo all'istanza di delegato.

using System;

delegate string[] ExtractMethod(string stringToManipulate, int maximum);

public class DelegateExample
{
   public static void Main()
   {
      // Instantiate delegate to reference ExtractWords method
      ExtractMethod extractMeth = ExtractWords;
      string title = "The Scarlet Letter";
      // Use delegate instance to call ExtractWords method and display result
      foreach (string word in extractMeth(title, 5))
         Console.WriteLine(word);
   }

   private static string[] ExtractWords(string phrase, int limit)
   {
      char[] delimiters = new char[] {' '};
      if (limit > 0)
         return phrase.Split(delimiters, limit);
      else
         return phrase.Split(delimiters);
   }
}

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

using System;

public class GenericFunc
{
   public static void Main()
   {
      // Instantiate delegate to reference ExtractWords method
      Func<string, int, string[]> extractMethod = ExtractWords;
      string title = "The Scarlet Letter";
      // Use delegate instance to call ExtractWords method and display result
      foreach (string word in extractMethod(title, 5))
         Console.WriteLine(word);
   }

   private static string[] ExtractWords(string phrase, int limit)
   {
      char[] delimiters = new char[] {' '};
      if (limit > 0)
         return phrase.Split(delimiters, limit);
      else
         return phrase.Split(delimiters);
   }
}

È possibile utilizzare il Func<T1, T2, TResult> delegati con metodi anonimi di c#, come illustrato nell'esempio seguente. (Per un'introduzione ai metodi anonimi, vedere Metodi anonimi (Guida per programmatori C#).)

using System;

public class Anonymous
{
   public static void Main()
   {
      Func<string, int, string[]> extractMeth = delegate(string s, int i)
         { char[] delimiters = new char[] {' '}; 
           return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters);
         };

      string title = "The Scarlet Letter";
      // Use Func instance to call ExtractWords method and display result
      foreach (string word in extractMeth(title, 5))
         Console.WriteLine(word);
   }
}

È inoltre possibile assegnare un'espressione lambda a un Func<T1, T2, TResult> delegato, come illustrato nell'esempio seguente. (Per un'introduzione alle espressioni lambda, vedere Lambda Expressions (Visual Basic) e Espressioni lambda (Guida per programmatori C#).)

using System;

public class LambdaExpression
{
   public static void Main()
   {
      char[] separators = new char[] {' '};
      Func<string, int, string[]> extract = (s, i) => 
           i > 0 ? s.Split(separators, i) : s.Split(separators) ;

      string title = "The Scarlet Letter";
      // Use Func instance to call ExtractWords method and display result
      foreach (string word in extract(title, 5))
         Console.WriteLine(word);
   }
}

Il tipo sottostante di un'espressione lambda è uno dei generica Func delegati. In questo modo possibile passare un'espressione lambda come un parametro senza assegnarla in modo esplicito un delegato. In particolare, poiché molti metodi dei tipi nel System.Linq dispone di spazio dei nomi Func<T1, T2, TResult> parametri, è possibile passare questi metodi di un'espressione lambda senza creare un'istanza in modo esplicito un Func<T1, T2, TResult> delegare.

Nell'esempio riportato di seguito viene illustrato come dichiarare e utilizzare un Func<T1, T2, TResult> delegare. In questo esempio dichiara un Func<T1, T2, TResult> variabile e assegna un'espressione lambda che accetta un String valore e un Int32 valore come parametri. L'espressione lambda restituisce true Se la lunghezza del String è uguale al valore di parametro di Int32 parametro. Il delegato che incapsula questo metodo viene usato in una query per filtrare le stringhe in una matrice di stringhe.

using System;
using System.Collections.Generic;
using System.Linq;

public class Func3Example
{
   public static void Main()
   {
      Func<String, int, bool> predicate = (str, index) => str.Length == index;

      String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
      IEnumerable<String> aWords = words.Where(predicate).Select(str => str);

      foreach (String word in aWords)
         Console.WriteLine(word);
   }
}

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: