Číst v angličtině

Sdílet prostřednictvím


Func<T,TResult> Delegát

Definice

Zapouzdří metodu, která má jeden parametr a vrátí hodnotu typu určeného parametrem TResult .

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

Parametry typu

T

Typ parametru metody, kterou tento delegát zapouzdřuje.

Tento parametr typu je kontravariantní. To znamená, že můžete použít buď zadaný typ, nebo libovolný typ, který je méně odvozený. Další informace o kovarianci a kontravarianci najdete v tématu popisujícím kovarianci a kontravarianci u parametrického polymorfismu.
TResult

Typ návratové hodnoty metody, kterou tento delegát zapouzdřuje.

Tento parametr typu je kovariantní. To znamená, že můžete použít buď zadaný typ, nebo libovolný typ, který je více odvozený. Další informace o kovarianci a kontravarianci najdete v tématu popisujícím kovarianci a kontravarianci u parametrického polymorfismu.

Parametry

arg
T

Parametr metody, kterou tento delegát zapouzdřuje.

Návratová hodnota

TResult

Návratová hodnota metody, kterou tento delegát zapouzdřuje.

Příklady

Následující příklad ukazuje, jak deklarovat a používat delegáta Func<T,TResult> . Tento příklad deklaruje proměnnou Func<T,TResult> a přiřadí jí výraz lambda, který převede znaky v řetězci na velká písmena. Delegát, který zapouzdřuje tuto metodu, je následně předán Enumerable.Select metodě ke změně řetězců v poli řetězců na velká písmena.

// 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

*/

Poznámky

Tento delegát můžete použít k reprezentaci metody, která může být předána jako parametr bez explicitního deklarování vlastního delegáta. Zapouzdřená metoda musí odpovídat podpisu metody, který je definován tímto delegátem. To znamená, že zapouzdřená metoda musí mít jeden parametr, který je jí předán hodnotou, a že musí vrátit hodnotu.

Poznámka

Chcete-li odkazovat na metodu, která má jeden parametr a vrací void (nebo v jazyce Visual Basic, která je deklarována jako Sub místo jako Function), použijte místo toho obecného Action<T> delegáta.

Při použití delegáta Func<T,TResult> nemusíte explicitně definovat delegáta, který zapouzdřuje metodu s jedním parametrem. Například následující kód explicitně deklaruje delegáta s názvem ConvertMethod a přiřadí odkaz na metodu UppercaseString její instanci delegáta.

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

Následující příklad zjednodušuje tento kód vytvořením instance delegáta Func<T,TResult> místo explicitní definice nového delegáta a přiřazení pojmenované metody.

// 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

Můžete také použít delegáta Func<T,TResult> s anonymními metodami v jazyce C#, jak ukazuje následující příklad. (Úvod k anonymním metodám najdete v tématu Anonymní metody.)

 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

Můžete také přiřadit výraz lambda delegátu Func<T,TResult> , jak je znázorněno na následujícím příkladu. (Úvod k výrazům lambda najdete v tématech Výrazy Lambda (VB), Lambda Expressions (C#) a Lambda Expressions (F#).)

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

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

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

Základním typem výrazu lambda je jeden z obecných Func delegátů. To umožňuje předat výraz lambda jako parametr bez explicitního přiřazení k delegátu. Zejména proto, že mnoho metod typů v System.Linq oboru názvů má Func<T,TResult> parametry, můžete těmto metodám předat výraz lambda bez explicitního vytvoření instance delegáta Func<T,TResult> .

Metody rozšíření

GetMethodInfo(Delegate)

Získá objekt, který představuje metodu reprezentovanou zadaným delegátem.

Platí pro

Produkt Verze
.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

Viz také