欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > C#中的委托

C#中的委托

2024/10/24 9:25:36 来源:https://blog.csdn.net/2401_86430346/article/details/142026357  浏览:    关键词:C#中的委托

Action委托

Action 委托是 C# 中预定义的委托类型之一,它是泛型委托 Action<T...> 的非泛型形式,用于表示不接受返回值的方法。Action 委托通常用于需要执行操作但不需要返回结果的场景,比如事件处理、异步编程或回调函数。

Action 委托有多个版本,分别对应不同数量的输入参数:

  • Action:不接受参数。

  • Action<T>:接受一个参数。

  • Action<T1, T2>:接受两个参数。

  • Action<T1, T2, T3>:接受三个参数。

  • Action<T1, T2, T3, T4>:接受四个参数。

  • 以此类推,最多可以有 16 个参数的 Action 泛型委托。

使用示例

以下是 Action 委托的一些使用示例:

无参数
// 定义一个不接受参数的方法
void PrintHello()
{Console.WriteLine("Hello");
}
​
// 创建Action委托实例并将其指向PrintHello方法
Action action = PrintHello;
​
// 调用委托,相当于调用PrintHello方法
action(); // 输出:Hello
带参数
// 定义一个接受两个参数的方法
void PrintSum(int x, int y)
{Console.WriteLine($"Sum: {x + y}");
}
​
// 创建Action委托实例并将其指向PrintSum方法
Action<int, int> actionWithParams = PrintSum;
​
// 调用委托,相当于调用PrintSum方法
actionWithParams(5, 3); // 输出:Sum: 8
作为事件处理器
// 定义一个事件
public event Action OnCustomEvent;
​
// 触发事件
protected virtual void OnRaiseCustomEvent()
{OnCustomEvent?.Invoke();
}
​
// 订阅事件
Action subscription = OnRaiseCustomEvent;
异步编程
// 定义一个异步方法
async Task PrintAfterDelay(string message)
{await Task.Delay(1000); // 模拟异步操作Console.WriteLine(message);
}
​
// 创建Action委托实例并将其指向异步方法
Action printAction = PrintAfterDelay;
​
// 调用委托
printAction("Hello after 1 second"); // 1秒后输出:Hello after 1 second

Action 委托简化了方法的引用和调用,使得代码更加简洁和易于理解。在实际开发中,Action 委托被广泛用于各种需要回调的场景。

Func委托

Func 委托是 C# 中预定义的委托类型之一,用于表示有返回值的方法。它是泛型委托 Func<T, TResult> 的非泛型形式。Func 委托通常用于需要执行操作并返回结果的场景,例如查询、转换或计算。

Func 委托有多个版本,分别对应不同数量的输入参数和返回值:

  • Func<TResult>:不接受参数,返回一个结果。

  • Func<T, TResult>:接受一个参数,返回一个结果。

  • Func<T1, T2, TResult>:接受两个参数,返回一个结果。

  • Func<T1, T2, T3, TResult>:接受三个参数,返回一个结果。

  • Func<T1, T2, T3, T4, TResult>:接受四个参数,返回一个结果。

  • 以此类推,最多可以有 16 个参数的 Func 泛型委托。

使用示例

以下是 Func 委托的一些使用示例:

无参数
// 定义一个不接受参数的方法
int GetNumber()
{return 42;
}
​
// 创建Func委托实例并将其指向GetNumber方法
Func<int> func = GetNumber;
​
// 调用委托,相当于调用GetNumber方法
int number = func(); // number 的值为 42
带参数
// 定义一个接受两个参数的方法
int Multiply(int x, int y)
{return x * y;
}
​
// 创建Func委托实例并将其指向Multiply方法
Func<int, int, int> funcWithParams = Multiply;
​
// 调用委托,相当于调用Multiply方法
int result = funcWithParams(5, 3); // result 的值为 15
作为LINQ查询的一部分
using System;
using System.Collections.Generic;
using System.Linq;
​
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
​
// 使用Func委托作为查询的一部分
var sum = numbers.Sum(Func<int, int>(x => x * 2)); // 计算所有元素的两倍之和
Console.WriteLine(sum); // 输出:30
用于转换
// 定义一个方法,将字符串转换为大写
string ToUpperCase(string input)
{return input.ToUpper();
}
​
// 创建Func委托实例并将其指向ToUpperCase方法
Func<string, string> converter = ToUpperCase;
​
// 调用委托,相当于调用ToUpperCase方法
string upperCase = converter("hello"); // upperCase 的值为 "HELLO"

Func 委托提供了一种灵活的方式来引用和调用方法,使得代码更加模块化和可重用。在实际开发中,Func 委托被广泛用于各种需要返回结果的场景,特别是在 LINQ 查询和数据处理中。

Predicate委托

在 C# 中,Predicate<T> 是一种特殊的泛型委托,用于定义一个接受单个参数并返回布尔值(truefalse)的方法。这种委托通常用于测试某个条件是否成立,因此它在筛选数据、执行条件检查等场景中非常有用。

定义

Predicate<T> 委托的声明如下:

public delegate bool Predicate<in T>(T obj);

这里 T 是泛型参数,表示任何类型的对象。

使用场景

Predicate<T> 常用于需要对集合中的元素进行条件筛选的情况,如 List<T>.Find 方法或 Array.Find 方法。

示例

筛选列表中的元素
using System;
using System.Collections.Generic;
​
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
​
// 使用Predicate委托来找出所有大于3的数字
Predicate<int> predicate = x => x > 3;
List<int> filteredNumbers = new List<int>();
foreach (int number in numbers)
{if (predicate(number)){filteredNumbers.Add(number);}
}
​
Console.WriteLine(string.Join(", ", filteredNumbers)); // 输出: 4, 5, 6
使用LINQ

Predicate<T> 也可以与 LINQ 方法结合使用,例如 Where 方法:

using System;
using System.Collections.Generic;
using System.Linq;
​
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
​
// 使用LINQ的Where方法和Predicate委托
var result = numbers.Where(new Predicate<int>(x => x > 3));
​
foreach (var number in result)
{Console.WriteLine(number); // 输出: 4, 5, 6
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com