Func<T,TResult> Делегат
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инкапсулирует метод с одним параметром, который возвращает значение типа, указанного в параметре TResult
.
generic <typename T, typename TResult>
public delegate TResult Func(T arg);
public delegate TResult Func<in T,out TResult>(T arg);
public delegate TResult Func<T,TResult>(T arg);
type Func<'T, 'Result> = delegate of 'T -> 'Result
Public Delegate Function Func(Of In T, Out TResult)(arg As T) As TResult
Public Delegate Function Func(Of T, TResult)(arg As T) As TResult
Параметры типа
- T
Тип параметра метода, инкапсулируемого данным делегатом.
Это контравариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся менее производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.- TResult
Тип возвращаемого значения метода, инкапсулируемого данным делегатом.
Это ковариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся более производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.Параметры
- arg
- T
Параметр метода, инкапсулируемого данным делегатом.
Возвращаемое значение
- TResult
Возвращаемое значение метода, инкапсулируемого данным делегатом.
Примеры
В следующем примере показано, как объявить и использовать Func<T,TResult> делегат. В этом примере объявляется Func<T,TResult> переменная и ей присваивается лямбда-выражение, преобразующее символы в строке в верхний регистр. Делегат, инкапсулирующий этот метод, затем передается Enumerable.Select методу для изменения строк в массиве строк на верхний.
// 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
*/
open System
open System.Linq
// Declare a Func variable and assign a lambda expression to the
// variable. The function takes a string and converts it to uppercase.
let selector = Func<string, string>(fun str -> str.ToUpper())
// Create a list of strings.
let words = [ "orange"; "apple"; "Article"; "elephant" ]
// Query the list and select strings according to the selector function.
let aWords = words.Select selector
// Output the results to the console.
for word in aWords do
printfn $"{word}"
// This code example produces the following output:
// ORANGE
// APPLE
// ARTICLE
// ELEPHANT
Imports System.Collections.Generic
Imports System.Linq
Module Func
Public Sub Main()
' Declare a Func variable and assign a lambda expression to the
' variable. The method takes a string and converts it to uppercase.
Dim selector As Func(Of String, String) = Function(str) str.ToUpper()
' Create an array of strings.
Dim words() As String = { "orange", "apple", "Article", "elephant" }
' Query the array and select strings according to the selector method.
Dim aWords As IEnumerable(Of String) = words.Select(selector)
' Output the results to the console.
For Each word As String In aWords
Console.WriteLine(word)
Next
End Sub
End Module
' This code example produces the following output:
'
' ORANGE
' APPLE
' ARTICLE
' ELEPHANT
// Declare a delegate
delegate String ^ MyDel(String ^);
// Create wrapper class and function that takes in a string and converts it to uppercase
ref class DelegateWrapper {
public:
String ^ ToUpper(String ^ s) {
return s->ToUpper();
}
};
int main() {
// Declare delegate
DelegateWrapper ^ delegateWrapper = gcnew DelegateWrapper;
MyDel ^ DelInst = gcnew MyDel(delegateWrapper, &DelegateWrapper::ToUpper);
// Cast into Func
Func<String ^, String ^> ^ selector = reinterpret_cast<Func<String ^, String ^> ^>(DelInst);
// Create an array of strings
array<String ^> ^ words = { "orange", "apple", "Article", "elephant" };
// Query the array and select strings according to the selector method
Generic::IEnumerable<String ^> ^ aWords = Enumerable::Select((Generic::IEnumerable<String^>^)words, selector);
// Output the results to the console
for each(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
метод его экземпляру делегата.
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();
}
}
type ConvertMethod = delegate of string -> string
let uppercaseString (inputString: string) =
inputString.ToUpper()
// Instantiate delegate to reference uppercaseString function
let convertMeth = ConvertMethod uppercaseString
let name = "Dakota"
// Use delegate instance to call uppercaseString function
printfn $"{convertMeth.Invoke name}"
' Declare a delegate to represent string conversion method
Delegate Function ConvertMethod(ByVal inString As String) As String
Module DelegateExample
Public Sub Main()
' Instantiate delegate to reference UppercaseString method
Dim convertMeth As ConvertMethod = AddressOf UppercaseString
Dim name As String = "Dakota"
' Use delegate instance to call UppercaseString method
Console.WriteLine(convertMeth(name))
End Sub
Private Function UppercaseString(inputString As String) As String
Return inputString.ToUpper()
End Function
End Module
В следующем примере этот код упрощается путем создания экземпляра Func<T,TResult> делегата вместо явного определения нового делегата и назначения ему именованного метода.
// 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
open System
let uppercaseString (inputString: string) =
inputString.ToUpper()
// Instantiate delegate to reference uppercaseString function
let convertMethod = Func<string, string> uppercaseString
let name = "Dakota"
// Use delegate instance to call uppercaseString function
printfn $"{convertMethod.Invoke name}"
// This code example produces the following output:
// DAKOTA
Module GenericFunc
Public Sub Main()
' Instantiate delegate to reference UppercaseString method
Dim convertMethod As Func(Of String, String) = AddressOf UppercaseString
Dim name As String = "Dakota"
' Use delegate instance to call UppercaseString method
Console.WriteLine(convertMethod(name))
End Sub
Private Function UppercaseString(inputString As String) As String
Return inputString.ToUpper()
End Function
End Module
Также можно использовать Func<T,TResult> делегат с анонимными методами в 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 #).)
Func<string, string> convert = s => s.ToUpper();
string name = "Dakota";
Console.WriteLine(convert(name));
// This code example produces the following output:
//
// DAKOTA
open System
let convert = Func<string, string>(fun s -> s.ToUpper())
let name = "Dakota"
printfn $"{convert.Invoke name}"
// This code example produces the following output:
// DAKOTA
Module LambdaExpression
Public Sub Main()
Dim convert As Func(Of String, String) = Function(s) s.ToUpper()
Dim name As String = "Dakota"
Console.WriteLine(convert(name))
End Sub
End Module
Базовый тип лямбда-выражения является одним из универсальных Func
делегатов. Это дает возможность передавать лямбда-выражение в качестве параметра без явного присвоения его делегату. В частности, поскольку многие методы типов в System.Linq пространстве имен имеют Func<T,TResult> Параметры, эти методы можно передать лямбда-выражению без явного создания экземпляра Func<T,TResult> делегата.
Методы расширения
GetMethodInfo(Delegate) |
Получает объект, представляющий метод, представленный указанным делегатом. |