Func<T, TResult> 委托
2014-08-12 17:45
411 查看
原帖地址: http://msdn.microsoft.com/zh-cn/library/bb549151(v=vs.100).aspx
命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
C#
C++
F#
VB
in T
此委托封装的方法的参数类型。
该类型参数是逆变的。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
out TResult
此委托封装的方法的返回值类型。
该类型参数是协变的。即可以使用指定的类型或派生程度更高的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
arg
类型:T
此委托封装的方法的参数。
类型:TResult
此委托封装的方法的返回值。
可以使用此委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且必须返回值。
在使用 Func<T,
TResult> 委托时,不必显式定义一个封装只有一个参数的方法的委托。 例如,以下代码显式声明了一个名为 ConvertMethod 的委托,并将对 UppercaseString 方法的引用分配给其委托实例。
C#
VB
以下示例简化了此代码,它所用的方法是实例化 Func<T,
TResult> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。
C#
VB
您也可以按照以下示例所演示的那样在 C# 中将 Func<T,
TResult> 委托与匿名方法一起使用。 (有关匿名方法的简介,请参见匿名方法(C#
编程指南)。)
C#
您也可以按照以下示例所演示的那样将 lambda 表达式分配给 Func<T,
TResult> 委托。 (有关
lambda 表达式的简介,请参见 Lambda
表达式 (Visual Basic)和 Lambda
表达式(C# 编程指南)。)
C#
VB
Lambda 表达式的基础类型是泛型 Func 委托之一。 这样能以参数形式传递
lambda 表达式,而不用显式将其分配给委托。 尤其是,因为 System.Linq 命名空间中许多类型方法具有 Func<T,
TResult> 参数,因此可以给这些方法传递
lambda 表达式,而不用显式实例化Func<T,
TResult> 委托。
下面的示例演示如何声明和使用 Func<T,
TResult> 委托。 此示例声明一个 Func<T,
TResult> 变量,并为其分配了一个将字符串中的字符转换为大写的
lambda 表达式。 随后将封装此方法的委托传递给 Enumerable.Select 方法,以将字符串数组中的字符串更改为大写。
C#
VB
命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
语法
C#C++
F#
VB
public delegate TResult Func<in T, out TResult>( T arg )
类型参数
in T此委托封装的方法的参数类型。
该类型参数是逆变的。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
out TResult
此委托封装的方法的返回值类型。
该类型参数是协变的。即可以使用指定的类型或派生程度更高的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
参数
arg类型:T
此委托封装的方法的参数。
返回值
类型:TResult此委托封装的方法的返回值。
备注
可以使用此委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且必须返回值。![]() 注意 |
---|
若要引用具有一个参数并返回 void 的方法(或者要在 Visual Basic 中引用被声明为 Sub 而不是被声明为 Function 的方法),请改用泛型 Action<T> 委托。 |
TResult> 委托时,不必显式定义一个封装只有一个参数的方法的委托。 例如,以下代码显式声明了一个名为 ConvertMethod 的委托,并将对 UppercaseString 方法的引用分配给其委托实例。
C#
VB
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#
VB
using System; public class GenericFunc { public static void Main() { // 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)); } private static string UppercaseString(string inputString) { return inputString.ToUpper(); } }
您也可以按照以下示例所演示的那样在 C# 中将 Func<T,
TResult> 委托与匿名方法一起使用。 (有关匿名方法的简介,请参见匿名方法(C#
编程指南)。)
C#
using System; public class Anonymous { public static void Main() { Func<string, string> convert = delegate(string s) { return s.ToUpper();}; string name = "Dakota"; Console.WriteLine(convert(name)); } }
您也可以按照以下示例所演示的那样将 lambda 表达式分配给 Func<T,
TResult> 委托。 (有关
lambda 表达式的简介,请参见 Lambda
表达式 (Visual Basic)和 Lambda
表达式(C# 编程指南)。)
C#
VB
using System; public class LambdaExpression { public static void Main() { Func<string, string> convert = s => s.ToUpper(); string name = "Dakota"; Console.WriteLine(convert(name)); } }
Lambda 表达式的基础类型是泛型 Func 委托之一。 这样能以参数形式传递
lambda 表达式,而不用显式将其分配给委托。 尤其是,因为 System.Linq 命名空间中许多类型方法具有 Func<T,
TResult> 参数,因此可以给这些方法传递
lambda 表达式,而不用显式实例化Func<T,
TResult> 委托。
示例
下面的示例演示如何声明和使用 Func<T,TResult> 委托。 此示例声明一个 Func<T,
TResult> 变量,并为其分配了一个将字符串中的字符转换为大写的
lambda 表达式。 随后将封装此方法的委托传递给 Enumerable.Select 方法,以将字符串数组中的字符串更改为大写。
C#
VB
using System; using System.Collections; using System.Collections.Generic; using System.Linq; static class Func { static void Main(string[] args) { // 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 */
相关文章推荐
- Func<T,TResult>泛型委托
- Func<T, TResult> 委托
- Func<T, TResult>泛型委托
- Func<T,TResult>泛型委托
- Func<T, ..., TResult> 委托 实现方法嵌套
- Func<TResult>委托,Action 委托,Tuple 类
- Func<T1, T2, TResult> 泛型委托
- Func<TResult>委托和Action委托
- Func<T, TResult> 委托
- Func<T,TResult>泛型委托
- 泛型委托 Action<T>和Func<T,TResult>
- Func<T,TResult>泛型委托
- C#的委托 Action<>和Func<>
- C# Func<>委托
- 泛型Action<T>委托和Func<T>委托是系统定义的两个泛型委托
- C#中的Action<T>、Func<T>委托和Lambda表达式
- 使用Func<T1, T2, TResult> 委托返回匿名对象
- 学习笔记之Func<T>与Action<T>委托泛型介绍
- action<> func<> 这2个委托使用和理解
- 如何声明和使用 Func<T1, T2, TResult> 委托