Func<T,TResult> Delegat
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Kapselt eine Methode, die über einen Parameter verfügt und einen Wert des Typs zurückgibt, der durch den TResult
-Parameter angegeben wird.
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
Typparameter
- T
Der Typ des Parameters der Methode, die dieser Delegat kapselt.
Dieser Typparameter ist kontravariant. Das bedeutet, dass Sie entweder den angegebenen Typ oder einen weniger abgeleiteten Typ verwenden können. Weitere Informationen zu Kovarianz und Kontravarianz finden Sie unter Kovarianz und Kontravarianz in Generics.- TResult
Der Typ des Rückgabewerts der Methode, die dieser Delegat kapselt.
Dieser Typparameter ist kovariant. Das bedeutet, dass Sie entweder den angegebenen Typ oder einen stärker abgeleiteten Typ verwenden können. Weitere Informationen zu Kovarianz und Kontravarianz finden Sie unter Kovarianz und Kontravarianz in Generics.Parameter
- arg
- T
Der Parameter der Methode, die dieser Delegat kapselt.
Rückgabewert
- TResult
Der Rückgabewert der Methode, die dieser Delegat kapselt.
Beispiele
Im folgenden Beispiel wird veranschaulicht, wie sie eine Func<T,TResult> Stellvertretung deklarieren und verwenden. In diesem Beispiel wird eine Func<T,TResult> Variable deklariert und ein Lambdaausdruck zugewiesen, der die Zeichen in einer Zeichenfolge in Großbuchstaben konvertiert. Der Delegate, der diese Methode kapselt, wird anschließend an die Enumerable.Select Methode übergeben, um die Zeichenfolgen in einem Array von Zeichenfolgen in Großbuchstaben zu ändern.
// 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
*/
}
Hinweise
Sie können diese Stellvertretung verwenden, um eine Methode darzustellen, die als Parameter übergeben werden kann, ohne einen benutzerdefinierten Delegaten explizit zu deklarieren. Die gekapselte Methode muss der von diesem Delegaten definierten Methodensignatur entsprechen. Dies bedeutet, dass die gekapselte Methode einen Parameter aufweisen muss, der nach Wert an ihn übergeben wird, und dass er einen Wert zurückgeben muss.
Hinweis
Wenn Sie auf eine Methode verweisen möchten, die einen Parameter enthält und zurückgibt void
(oder in Visual Basic, das anstelle Sub
einer ) Function
deklariert wird, verwenden Sie stattdessen den generischen DelegatenAction<T>.
Wenn Sie die Func<T,TResult> Stellvertretung verwenden, müssen Sie keine Stellvertretung explizit definieren, die eine Methode mit einem einzelnen Parameter kapselt. Der folgende Code deklariert beispielsweise explizit einen Delegaten namens und ConvertMethod
weist der Stellvertretungsinstanz einen Verweis auf die UppercaseString
Methode zu.
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
Im folgenden Beispiel wird dieser Code vereinfacht, indem der Func<T,TResult> Delegate instanziiert wird, anstatt eine neue Stellvertretung explizit zu definieren und ihm eine benannte Methode zuzuweisen.
// 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
Sie können die Func<T,TResult> Stellvertretung auch mit anonymen Methoden in C# verwenden, wie das folgende Beispiel veranschaulicht. (Eine Einführung in anonyme Methoden finden Sie unter Anonyme Methoden.)
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
Sie können einem Func<T,TResult> Delegaten auch einen Lambda-Ausdruck zuweisen, wie das folgende Beispiel veranschaulicht. (Eine Einführung in Lambda-Ausdrücke finden Sie unter Lambda-Ausdrücke (VB), Lambda-Ausdrücke (C#) und Lambda-Ausdrücke (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
Der zugrunde liegende Typ eines Lambda-Ausdrucks ist eine der generischen Func
Stellvertretungen. Dies ermöglicht es, einen Lambda-Ausdruck als Parameter zu übergeben, ohne ihn explizit einem Delegaten zuzuweisen. Insbesondere, da viele Methoden von Typen im System.Linq Namespace Parameter haben Func<T,TResult> , können Sie diese Methoden einen Lambda-Ausdruck übergeben, ohne einen Func<T,TResult> Delegaten explizit instanziieren zu müssen.
Erweiterungsmethoden
GetMethodInfo(Delegate) |
Ruft ein Objekt ab, das die Methode darstellt, die vom angegebenen Delegaten dargestellt wird. |