Func<T1,T2,T3,TResult> Delegar
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Encapsula um método que tem três parâmetros e devolve um valor do tipo especificado pelo TResult parâmetro.
generic <typename T1, typename T2, typename T3, typename TResult>
public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<in T1,in T2,in T3,out TResult>(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<in T1,in T2,in T3,out TResult>(T1 arg1, T2 arg2, T3 arg3) where T1 : allows ref struct where T2 : allows ref struct where T3 : allows ref struct where TResult : allows ref struct;
public delegate TResult Func<T1,T2,T3,TResult>(T1 arg1, T2 arg2, T3 arg3);
type Func<'T1, 'T2, 'T3, 'Result> = delegate of 'T1 * 'T2 * 'T3 -> 'Result
Public Delegate Function Func(Of In T1, In T2, In T3, Out TResult)(arg1 As T1, arg2 As T2, arg3 As T3) As TResult
Public Delegate Function Func(Of T1, T2, T3, TResult)(arg1 As T1, arg2 As T2, arg3 As T3) As TResult
Parâmetros de Tipo Genérico
- T1
O tipo do primeiro parâmetro do método que este delegado encapsula.
Este parâmetro de tipo é contravariante. Ou seja, pode utilizar o tipo que especificou ou qualquer tipo que seja menos derivado. Para obter mais informações sobre covariância e contravariância, veja Covariância e Contravariância em Genérico.- T2
O tipo do segundo parâmetro do método que este delegado encapsula.
Este parâmetro de tipo é contravariante. Ou seja, pode utilizar o tipo que especificou ou qualquer tipo que seja menos derivado. Para obter mais informações sobre covariância e contravariância, veja Covariância e Contravariância em Genérico.- T3
O tipo do terceiro parâmetro do método que este delegado encapsula.
Este parâmetro de tipo é contravariante. Ou seja, pode utilizar o tipo que especificou ou qualquer tipo que seja menos derivado. Para obter mais informações sobre covariância e contravariância, veja Covariância e Contravariância em Genérico.- TResult
O tipo do valor de retorno do método que este delegado encapsula.
Este parâmetro de tipo é covariante. Ou seja, pode utilizar o tipo que especificou ou qualquer tipo que seja mais derivado. Para obter mais informações sobre covariância e contravariância, veja Covariância e Contravariância em Genérico.Parâmetros
- arg1
- T1
O primeiro parâmetro do método que este delegado encapsula.
- arg2
- T2
O segundo parâmetro do método que este delegado encapsula.
- arg3
- T3
O terceiro parâmetro do método que este delegado encapsula.
Devolver Valor
O valor de retorno do método que este delegado encapsula.
Exemplos
O exemplo seguinte demonstra como declarar e usar um Func<T1,T2,TResult> delegado. Este exemplo declara uma Func<T1,T2,TResult> variável e atribui-lhe uma expressão lambda que toma um String valor e um Int32 valor como parâmetros. A expressão lambda retorna true se o comprimento do String parâmetro for igual ao valor do Int32 parâmetro. O delegado que encapsula este método é posteriormente usado numa consulta para filtrar cadeias num array de cadeias.
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);
}
}
open System
open System.Linq
let predicate = Func<string, int, bool>(fun str index -> str.Length = index)
let words = [ "orange"; "apple"; "Article"; "elephant"; "star"; "and" ]
let aWords = words.Where predicate
for word in aWords do
printfn $"{word}"
Imports System.Collections.Generic
Imports System.Linq
Public Module Func3Example
Public Sub Main()
Dim predicate As Func(Of String, Integer, Boolean) = Function(str, index) str.Length = index
Dim words() As String = { "orange", "apple", "Article", "elephant", "star", "and" }
Dim aWords As IEnumerable(Of String) = words.Where(predicate)
For Each word As String In aWords
Console.WriteLine(word)
Next
End Sub
End Module
Observações
Pode usar este delegado para representar um método que pode ser passado como parâmetro sem declarar explicitamente um delegado personalizado. O método encapsulado deve corresponder à assinatura do método definida por este delegado. Isto significa que o método encapsulado deve ter três parâmetros, cada um dos quais lhe é passado por valor, e que deve devolver um valor.
Note
Para referenciar um método que tem três parâmetros e devolve void (unit em F#) (ou em Visual Basic, que é declarado como Sub em vez de Function), use o delegado genérico Action<T1,T2,T3> em vez disso.
Quando usa o Func<T1,T2,T3,TResult> delegado, não precisa de definir explicitamente um delegado que encapsule um método com três parâmetros. Por exemplo, o código seguinte declara explicitamente um delegado genérico nomeado ParseNumber e atribui uma referência ao Parse método à sua instância delegada.
using System;
using System.Globalization;
delegate T ParseNumber<T>(string input, NumberStyles styles,
IFormatProvider provider);
public class DelegateExample
{
public static void Main()
{
string numericString = "-1,234";
ParseNumber<int> parser = int.Parse;
Console.WriteLine(parser(numericString,
NumberStyles.Integer | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture));
}
}
open System
open System.Globalization
type ParseNumber<'T> = delegate of (string * NumberStyles * IFormatProvider) -> 'T
let numericString = "-1,234"
let parser = ParseNumber<int> Int32.Parse
parser.Invoke(
numericString,
NumberStyles.Integer ||| NumberStyles.AllowThousands,
CultureInfo.InvariantCulture )
|> printfn "%i"
Imports System.Globalization
Delegate Function ParseNumber(Of T)(input As String, styles As NumberStyles, _
provider As IFormatProvider) As T
Module DelegateExample
Public Sub Main()
Dim numericString As String = "-1,234"
Dim parser As ParseNumber(Of Integer) = AddressOf Integer.Parse
Console.WriteLine(parser(numericString, _
NumberStyles.Integer Or NumberStyles.AllowThousands, _
CultureInfo.InvariantCulture))
End Sub
End Module
O exemplo seguinte simplifica este código ao instanciar o Func<T1,T2,T3,TResult> delegado em vez de definir explicitamente um novo delegado e atribuir-lhe um método nomeado.
using System;
using System.Globalization;
public class GenericFunc
{
public static void Main()
{
string numericString = "-1,234";
Func<string, NumberStyles, IFormatProvider, int> parser = int.Parse;
Console.WriteLine(parser(numericString,
NumberStyles.Integer | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture));
}
}
open System
open System.Globalization
let parseInt (str: string) styles format = Int32.Parse(str, styles, format)
let numericString = "-1,234"
let parser =
Func<string, NumberStyles, IFormatProvider, int> parseInt
parser.Invoke(
numericString,
NumberStyles.Integer ||| NumberStyles.AllowThousands,
CultureInfo.InvariantCulture )
|> printfn "%i"
Imports System.Globalization
Module GenericFunc
Public Sub Main()
Dim numericString As String = "-1,234"
Dim parser As Func(Of String, NumberStyles, IFormatProvider, Integer) _
= AddressOf Integer.Parse
Console.WriteLine(parser(numericString, _
NumberStyles.Integer Or NumberStyles.AllowThousands, _
CultureInfo.InvariantCulture))
End Sub
End Module
Pode usar o Func<T1,T2,T3,TResult> delegado com métodos anónimos em C#, como o exemplo seguinte ilustra. (Para uma introdução aos métodos anónimos, veja Métodos Anónimos.)
using System;
using System.Globalization;
public class Anonymous
{
public static void Main()
{
string numericString = "-1,234";
Func<string, NumberStyles, IFormatProvider, int> parser =
delegate(string s, NumberStyles sty, IFormatProvider p)
{ return int.Parse(s, sty, p); };
Console.WriteLine(parser(numericString,
NumberStyles.Integer | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture));
}
}
Também pode atribuir uma expressão lambda a um Func<T1,T2,T3,TResult> delegado, como ilustra o exemplo seguinte. (Para uma introdução às expressões lambda, veja Expressões Lambda (VB),Expressões Lambda (C#) e Expressões Lambda (F#).)
using System;
using System.Globalization;
public class LambdaExpression
{
public static void Main()
{
string numericString = "-1,234";
Func<string, NumberStyles, IFormatProvider, int> parser = (s, sty, p)
=> int.Parse(s, sty, p);
Console.WriteLine(parser(numericString,
NumberStyles.Integer | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture));
}
}
open System
open System.Globalization
let numericString = "-1,234"
let parser = Func<string, NumberStyles, IFormatProvider, int>(fun s sty p ->
Int32.Parse(s, sty, p))
parser.Invoke(numericString,
NumberStyles.Integer ||| NumberStyles.AllowThousands,
CultureInfo.InvariantCulture)
|> printfn "%i"
Imports System.Globalization
Module LambdaExpression
Public Sub Main()
Dim numericString As String = "-1,234"
Dim parser As Func(Of String, NumberStyles, IFormatProvider, Integer) _
= Function(s, sty, p) Integer.Parse(s, sty, p)
Console.WriteLine(parser(numericString, _
NumberStyles.Integer Or NumberStyles.AllowThousands, _
CultureInfo.InvariantCulture))
End Sub
End Module
O tipo subjacente de uma expressão lambda é um dos delegados genéricos Func . Isto torna possível passar uma expressão lambda como parâmetro sem a atribuir explicitamente a um delegado. Em particular, porque muitos métodos de tipos no System.Linq namespace têm Func parâmetros, pode passar a esses métodos uma expressão lambda sem instanciar explicitamente um Func delegado.
Métodos da Extensão
| Name | Description |
|---|---|
| GetMethodInfo(Delegate) |
Obtém um objeto que representa o método representado pelo delegado especificado. |