Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Func<T,TResult> Delegat

Definicja

Hermetyzuje metodę, która ma jeden parametr i zwraca wartość typu określonego TResult przez parametr .

C#
public delegate TResult Func<in T,out TResult>(T arg);
C#
public delegate TResult Func<T,TResult>(T arg);

Parametry typu

T

Typ parametru metody, który ten delegat hermetyzuje.

Ten parametr typu jest kontrawariantny. Oznacza to, że możesz użyć typu, który został przez Ciebie określony, lub dowolnego typu, który jest mniej pochodny. Aby uzyskać więcej informacji o kowariancji i kontrawariancji, zobacz Kowariancja i kontrawariancja w typach ogólnych.
TResult

Typ zwracanej wartości metody, którą hermetyzuje ten delegat.

Ten parametr typu jest kowariantny. Oznacza to, że możesz użyć typu, który został przez Ciebie określony, lub dowolnego typu, który jest bardziej pochodny. Aby uzyskać więcej informacji o kowariancji i kontrawariancji, zobacz Kowariancja i kontrawariancja w typach ogólnych.

Parametry

arg
T

Parametr metody, którą hermetyzuje ten delegat.

Wartość zwracana

TResult

Zwracana wartość metody, którą hermetyzuje ten delegat.

Przykłady

W poniższym przykładzie pokazano, jak zadeklarować delegata i używać go Func<T,TResult> . W tym przykładzie zadeklarowano zmienną Func<T,TResult> i przypisano do niej wyrażenie lambda, które konwertuje znaki w ciągu na wielkie litery. Delegat hermetyzujący tę metodę jest następnie przekazywany do Enumerable.Select metody w celu zmiany ciągów w tablicy ciągów na wielkie litery.

C#
// Declare a Func variable and assign a lambda expression to the
// variable. The method takes a string and converts it to uppercase.
Func<string, string> selector = str => str.ToUpper();

// Create an array of strings.
string[] words = { "orange", "apple", "Article", "elephant" };
// Query the array and select strings according to the selector method.
IEnumerable<String> aWords = words.Select(selector);

// Output the results to the console.
foreach (String word in aWords)
    Console.WriteLine(word);

/*
This code example produces the following output:

ORANGE
APPLE
ARTICLE
ELEPHANT

*/

Uwagi

Tego delegata można użyć do reprezentowania metody, którą można przekazać jako parametr bez jawnego deklarowania delegata niestandardowego. Hermetyzowana metoda musi odpowiadać podpisowi metody zdefiniowanej przez ten delegat. Oznacza to, że metoda hermetyzowana musi mieć jeden parametr, który jest do niego przekazywany przez wartość, i że musi zwrócić wartość.

Uwaga

Aby odwołać się do metody, która ma jeden parametr i zwraca void (lub w Visual Basic, który jest zadeklarowany jako a Sub , a nie jako Function), należy zamiast tego użyć delegata ogólnego Action<T> .

Jeśli używasz delegata Func<T,TResult> , nie musisz jawnie definiować delegata, który hermetyzuje metodę za pomocą jednego parametru. Na przykład poniższy kod jawnie deklaruje delegata o nazwie ConvertMethod i przypisuje odwołanie do UppercaseString metody do jej wystąpienia delegata.

C#
using System;

delegate string ConvertMethod(string inString);

public class DelegateExample
{
   public static void Main()
   {
      // Instantiate delegate to reference UppercaseString method
      ConvertMethod convertMeth = UppercaseString;
      string name = "Dakota";
      // Use delegate instance to call UppercaseString method
      Console.WriteLine(convertMeth(name));
   }

   private static string UppercaseString(string inputString)
   {
      return inputString.ToUpper();
   }
}

Poniższy przykład upraszcza ten kod przez utworzenie wystąpienia delegata Func<T,TResult> zamiast jawnego zdefiniowania nowego delegata i przypisania do niego nazwanej metody.

C#
// Instantiate delegate to reference UppercaseString method
Func<string, string> convertMethod = UppercaseString;
string name = "Dakota";
// Use delegate instance to call UppercaseString method
Console.WriteLine(convertMethod(name));

string UppercaseString(string inputString)
{
   return inputString.ToUpper();
}

// This code example produces the following output:
//
//    DAKOTA

Możesz również użyć delegata Func<T,TResult> z metodami anonimowymi w języku C#, jak pokazano w poniższym przykładzie. (Aby zapoznać się z wprowadzeniem do metod anonimowych, zobacz Metody anonimowe).

C#
 Func<string, string> convert = delegate(string s)
    { return s.ToUpper();};

 string name = "Dakota";
 Console.WriteLine(convert(name));

// This code example produces the following output:
//
//    DAKOTA

Można również przypisać wyrażenie lambda do delegata Func<T,TResult> , jak pokazano w poniższym przykładzie. (Aby zapoznać się z wprowadzeniem do wyrażeń lambda, zobacz Wyrażenia lambda (VB),Lambda Expressions (C#) i Lambda Expressions (F#)).

C#
Func<string, string> convert = s => s.ToUpper();

string name = "Dakota";
Console.WriteLine(convert(name));

// This code example produces the following output:
//
//    DAKOTA

Podstawowym typem wyrażenia lambda jest jeden z delegatów ogólnych Func . Dzięki temu można przekazać wyrażenie lambda jako parametr bez jawnego przypisania go do delegata. W szczególności, ponieważ wiele metod typów w System.Linq przestrzeni nazw ma Func<T,TResult> parametry, można przekazać te metody wyrażenie lambda bez jawnego utworzenia wystąpienia delegata Func<T,TResult> .

Metody rozszerzania

GetMethodInfo(Delegate)

Pobiera obiekt reprezentujący metodę reprezentowaną przez określonego delegata.

Dotyczy

Produkt Wersje
.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, 8, 9, 10
.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, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Zobacz też