Func<T,TResult> Delegera

Definition

Kapslar in en metod som har en parameter och returnerar ett värde av den typ som anges av parametern 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<in T,out TResult>(T arg) where T : allows ref struct where TResult : allows ref struct;
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 

Typparametrar

T

Typen av parameter för metoden som det här ombudet kapslar in.

Det här är en contravariant-typparameter. Det innebär att du kan använda antingen den typ du angett eller en typ som inte är lika härledd. Mer information om kovarians och kontravarians finns i Kovarians och kontravarians i Generisk typ.
TResult

Typen av returvärde för den metod som ombudet kapslar in.

Det här är en covariant-typparameter. Det innebär att du kan använda antingen den typ du angett eller en typ som är mer härledd. Mer information om kovarians och kontravarians finns i Kovarians och kontravarians i Generisk typ.

Parametrar

arg
T

Parametern för metoden som det här ombudet kapslar in.

Returvärde

TResult

Returvärdet för metoden som det här ombudet kapslar in.

Exempel

I följande exempel visas hur du deklarerar och använder ett Func<T,TResult> ombud. Det här exemplet deklarerar en Func<T,TResult> variabel och tilldelar den ett lambda-uttryck som konverterar tecknen i en sträng till versaler. Ombudet som kapslar in den här metoden skickas sedan till Enumerable.Select metoden för att ändra strängarna i en matris med strängar till versaler.

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

Kommentarer

Du kan använda det här ombudet för att representera en metod som kan skickas som en parameter utan att uttryckligen deklarera ett anpassat ombud. Den inkapslade metoden måste motsvara den metodsignatur som definieras av det här ombudet. Det innebär att den inkapslade metoden måste ha en parameter som skickas till den med ett värde och att den måste returnera ett värde.

Note

Om du vill referera till en metod som har en parameter och returnerar void (eller i Visual Basic, som deklareras som en Sub i stället för som en Function), använder du det allmänna ombudet Action<T> i stället.

När du använder ombudet Func<T,TResult> behöver du inte uttryckligen definiera ett ombud som kapslar in en metod med en enda parameter. Följande kod deklarerar till exempel uttryckligen ett ombud med namnet ConvertMethod och tilldelar en referens till UppercaseString metoden till dess delegatinstans.

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

Följande exempel förenklar den här koden genom att instansiera ombudet i stället för att uttryckligen definiera ett nytt ombud och tilldela en namngiven Func<T,TResult> metod till den.

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

Du kan också använda ombudet Func<T,TResult> med anonyma metoder i C#, vilket visas i följande exempel. (En introduktion till anonyma metoder finns i Anonyma metoder.)

 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

Du kan också tilldela ett lambda-uttryck till ett Func<T,TResult> ombud, vilket visas i följande exempel. (En introduktion till lambda-uttryck finns i Lambda Expressions (VB), Lambda Expressions (C#) och 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
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

Den underliggande typen av ett lambda-uttryck är en av de allmänna Func ombuden. Detta gör det möjligt att skicka ett lambda-uttryck som en parameter utan att uttryckligen tilldela det till ett ombud. Eftersom många typer av typer i System.Linq namnområdet har Func<T,TResult> parametrar kan du skicka dessa metoder till ett lambda-uttryck utan att uttryckligen instansiera ett Func<T,TResult> ombud.

Tilläggsmetoder

Name Description
GetMethodInfo(Delegate)

Hämtar ett objekt som representerar den metod som representeras av det angivna ombudet.

Gäller för

Se även