Прочитать на английском

Поделиться через


Func<T,TResult> Делегат

Определение

Инкапсулирует метод с одним параметром, который возвращает значение типа, указанного в параметре TResult.

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

Параметры типа

T

Тип параметра метода, инкапсулируемого данным делегатом.

Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.
TResult

Тип возвращаемого значения метода, инкапсулируемого данным делегатом.

Это ковариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся более производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.

Параметры

arg
T

Параметр метода, инкапсулируемого данным делегатом.

Возвращаемое значение

TResult

Возвращаемое значение метода, инкапсулируемого данным делегатом.

Примеры

В следующем примере показано, как объявить и использовать Func<T,TResult> делегат. В этом примере объявляется Func<T,TResult> переменная и ей присваивается лямбда-выражение, преобразующее символы в строке в верхний регистр. Делегат, инкапсулирующий этот метод, затем передается Enumerable.Select методу для изменения строк в массиве строк на верхний.

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

*/

Комментарии

Этот делегат можно использовать для представления метода, который можно передать в качестве параметра без явного объявления пользовательского делегата. Инкапсулированный метод должен соответствовать сигнатуре метода, определяемого этим делегатом. Это означает, что инкапсулированный метод должен иметь один параметр, который передается ему по значению и должен возвращать значение.

Примечание

для ссылки на метод, имеющий один параметр, и возвращает void (или в Visual Basic, который объявлен как a, Sub а не как Function ), вместо него следует использовать универсальный Action<T> делегат.

При использовании Func<T,TResult> делегата нет необходимости явно определять делегат, инкапсулирующий метод с одним параметром. Например, следующий код явно объявляет делегат с именем ConvertMethod и присваивает ссылку на UppercaseString метод его экземпляру делегата.

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

В следующем примере этот код упрощается путем создания экземпляра Func<T,TResult> делегата вместо явного определения нового делегата и назначения ему именованного метода.

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

Также можно использовать Func<T,TResult> делегат с анонимными методами в C#, как показано в следующем примере. (Общие сведения о анонимных методах см. в разделе анонимные методы.)

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

Можно также присвоить делегату лямбда-выражение Func<T,TResult> , как показано в следующем примере. (Общие сведения о лямбда-выражениях см. в разделе лямбда-выражения (VB), лямбда-выражения (C#) и лямбда-выражения (F #).)

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

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

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

Базовый тип лямбда-выражения является одним из универсальных Func делегатов. Это дает возможность передавать лямбда-выражение в качестве параметра без явного присвоения его делегату. В частности, поскольку многие методы типов в System.Linq пространстве имен имеют Func<T,TResult> Параметры, эти методы можно передать лямбда-выражению без явного создания экземпляра Func<T,TResult> делегата.

Методы расширения

GetMethodInfo(Delegate)

Получает объект, представляющий метод, представленный указанным делегатом.

Применяется к

Продукт Версии
.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

См. также раздел