Ler em inglês

Compartilhar via


Func<T1,T2,TResult> Delegar

Definição

Encapsula um método que tem dois parâmetros e retorna um valor do tipo especificado pelo parâmetro TResult.

C#
public delegate TResult Func<in T1,in T2,out TResult>(T1 arg1, T2 arg2);
C#
public delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2);

Parâmetros de tipo

T1

O tipo do primeiro parâmetro do método encapsulado por esse delegado.

Este parâmetro de tipo é contravariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo menos derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.
T2

O tipo do segundo parâmetro do método encapsulado por esse delegado.

Este parâmetro de tipo é contravariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo menos derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.
TResult

O tipo do valor retornado do método encapsulado por esse delegado.

Este parâmetro de tipo é covariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo mais derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.

Parâmetros

arg1
T1

O primeiro parâmetro do método encapsulado por esse delegado.

arg2
T2

O segundo parâmetro do método encapsulado por esse delegado.

Valor Retornado

TResult

O valor retornado do método encapsulado por esse delegado.

Exemplos

O exemplo a seguir demonstra como declarar e usar um Func<T1,T2,TResult> delegado. Este exemplo declara uma Func<T1,T2,TResult> variável e atribui a ela uma expressão lambda que usa um String valor e um Int32 valor como parâmetros. A expressão lambda retornará true se o comprimento do String parâmetro for igual ao valor do Int32 parâmetro. O delegado que encapsula esse método é usado posteriormente em uma consulta para filtrar cadeias de caracteres em uma matriz de cadeias de caracteres.

C#
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);
   }
}

Comentários

Você pode usar esse delegado para representar um método que pode ser passado como um parâmetro sem declarar explicitamente um delegado personalizado. O método encapsulado deve corresponder à assinatura do método definida por esse delegado. Isso significa que o método encapsulado deve ter dois parâmetros, cada um deles passado para ele por valor e que ele deve retornar um valor.

Observação

Para fazer referência a um método que tem dois parâmetros e retorna void ( em F#) (ou em Visual Basic, que é declarado como um Sub e não como um Function), use o delegado genérico Action<T1,T2> em vezunit disso.

Ao usar o Func<T1,T2,TResult> delegado, você não precisa definir explicitamente um delegado que encapsula um método com dois parâmetros. Por exemplo, o código a seguir declara explicitamente um delegado nomeado ExtractMethod e atribui uma referência ao ExtractWords método à instância delegada.

C#
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);
   }
}

O exemplo a seguir simplifica esse código instanciando um Func<T1,T2,TResult> delegado em vez de definir explicitamente um novo delegado e atribuir um método nomeado a ele.

C#
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);
   }
}

Você pode usar o Func<T1,T2,TResult> delegado com métodos anônimos em C#, como ilustra o exemplo a seguir. (Para obter uma introdução aos métodos anônimos, consulte Métodos Anônimos.)

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);
   }
}

Você também pode atribuir uma expressão lambda a um Func<T1,T2,TResult> delegado, como ilustra o exemplo a seguir. (Para obter uma introdução às expressões lambda, consulte Expressões Lambda (VB), Expressões Lambda (C#) e Expressões Lambda (F#).)

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);
   }
}

O tipo subjacente de uma expressão lambda é um dos delegados genéricos Func . Isso possibilita passar uma expressão lambda como um parâmetro sem atribuir explicitamente a um delegado. Em particular, como muitos métodos de tipos no System.Linq namespace têm Func<T1,T2,TResult> parâmetros, você pode passar a esses métodos uma expressão lambda sem instanciar explicitamente um Func<T1,T2,TResult> delegado.

Métodos de Extensão

GetMethodInfo(Delegate)

Obtém um objeto que representa o método representado pelo delegado especificado.

Aplica-se a

Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Confira também