Func<T,TResult> 委托——学习记录


重点

命名空间:System
程序集:mscorlib.dll, System.Runtime.dll
必须返回一个值


提示:以下是本篇文章正文内容,下面案例可供参考

一、Func<T,TResult> 委托是什么?

封装一个方法,该方法具有一个参数,且返回由 TResult 参数指定的类型的值

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

T 为此委托封装的方法的参数类型。
TResult 为此委托封装的方法的返回值类型。

二、示例

1.常规用法

下面的示例演示如何声明和使用 Func<T,TResult> 委托。 此示例声明一个 Func<T,TResult> 变量,并为其分配一个 lambda 表达式,该表达式将字符串中的字符转换为大写。 然后将封装此方法的委托传递给 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

*/

注解:使用此委托来表示一个方法,该方法可作为参数传递,而无需显式声明自定义委托。 封装的方法必须对应于由此委托定义的方法签名。 这意味着,封装的方法必须具有一个通过值传递给它的参数,并且必须返回一个值。若要引用一个方法,该方法具有一个参数并返回 void 的方法 Function ,请改用泛型 Action 委托。

2. lambda 表达式分配给 Func<T,TResult> 委托

代码如下(示例):

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

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

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

Lambda 表达式的基础类型是一个泛型 Func 委托。 这样,便可以将 lambda 表达式作为参数传递,而无需将其显式分配给委托。 具体而言,因为命名空间中的许多类型的方法 System.Linq 都有 Func<T,TResult> 参数,所以可以将这些方法传递给 lambda 表达式,而无需显式实例化 Func<T,TResult> 委托。


总结

Func<T1,T2,T3,T4,T5,T6,T7,T8,TResult> 委托

public delegate TResult Func<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);

该方法具有八个参数,并返回 TResult 参数所指定的类型的值。还有9-16个参数的,简单点说就是有返回值的委托,必须返回一个值。日常使用中,用过两次基本就熟悉了,不用刻意记忆哈

好的,下面是一个 Blazor 中使用 `IsModified(Expression<Func<object>> accessor)` 方法的例子: 假设我们有一个表单,包含两个文本输入框,分别用于输入名字和年龄。我们想要在用户修改表单内容时检查某个特定的输入框是否被修改过,如果被修改过则弹出一个提示框。 首先,我们需要在组件中定义 EditContext 和 FieldIdentifier 对象: ``` @using Microsoft.AspNetCore.Components.Forms <EditForm Model="@person" OnValidSubmit="@HandleValidSubmit"> <DataAnnotationsValidator /> <ValidationSummary /> <label for="name">Name:</label> <InputText id="name" @bind-Value="person.Name" /> <ValidationMessage For="@(() => person.Name)" /> <label for="age">Age:</label> <InputNumber id="age" @bind-Value="person.Age" /> <ValidationMessage For="@(() => person.Age)" /> </EditForm> @code { private Person person = new Person(); private EditContext editContext; protected override void OnInitialized() { editContext = new EditContext(person); } private void HandleValidSubmit() { if (editContext.IsModified(() => person.Age)) { // Show a popup or do something else } } } ``` 在上面的代码中,我们创建了一个名为 `person` 的对象,用于保存用户输入的数据。我们还创建了一个 `editContext` 对象,用于跟踪表单的状态。在组件的 `OnInitialized` 方法中,我们将 `person` 对象传递给 `editContext` 构造函数,以便 `editContext` 能够跟踪 `person` 对象的变化。 在 `HandleValidSubmit` 方法中,我们使用 lambda 表达式创建了一个 `accessor` 对象,用于指定要检查的输入框。然后,我们调用 `editContext.IsModified(() => person.Age)` 方法来检查特定的输入框是否被修改过。如果输入框被修改过,则弹出一个提示框或执行其他操作。 请注意,`IsModified(Expression<Func<object>> accessor)` 方法中的 `accessor` 参数是一个 lambda 表达式,用于指定要检查的输入框。在 lambda 表达式中,我们需要返回一个对象,该对象具有所选属性的类型和名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self85

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值