当前位置:首页 > 技术知识 > 正文内容

c#内置委托Action、Func、Predicate

maynowei9个月前 (10-02)技术知识131

在 C# 中,内置的委托类型主要存在于 System 命名空间以及后续版本引入的更多泛型委托中。这些委托极大地简化了代码,尤其是在使用 Lambda 表达式和 LINQ 时。

现代泛型委托 (C# 2.0 及以后)

C# 2.0 引入了泛型,随之诞生了一系列强大的内置泛型委托,它们成为了现代 C# 编程的基石。

1. Action系列委托

用于表示没有返回值的方法(void 方法)。

签名

对应 Lambda 表达式类型

Action

void Method()

() => { ... }

Action<T>

void Method(T obj)

(x) => { ... }x => { ... }

Action<T1, T2>

void Method(T1 arg1, T2 arg2)

(x, y) => { ... }

Action<T1, T2, T3>

void Method(T1 arg1, T2 arg2, T3 arg3)

(x, y, z) => { ... }

...

...

...

Action<T1, ..., T16>

void Method(T1 arg1, ..., T16 arg16)

最多支持 16 个输入参数

示例:

// 使用 Action<string> 委托表示一个接受 string 参数的 void 方法
Action<string> logHandler = (message) => Console.WriteLine(#34;Log: {message}");
logHandler("Hello, Action!"); // 输出: Log: Hello, Action!

2. Func系列委托

用于表示有返回值的方法。

委托

签名

对应 Lambda 表达式类型

Func<TResult>

TResult Method()

() => ... (返回一个值)

Func<T, TResult>

TResult Method(T obj)

x => ... (返回一个值)

Func<T1, T2, TResult>

TResult Method(T1 arg1, T2 arg2)

(x, y) => ... (返回一个值)

...

...

...

Func<T1, ..., T16, TResult>

TResult Method(T1 arg1, ..., T16 arg16)

最多支持 16 个输入参数,最后一个泛型参数 TResult 总是返回值类型

示例:

// 使用 Func<int, int, int> 委托表示一个接受两个 int 参数并返回 int 的方法
Func<int, int, int> add = (a, b) => a + b;
int result = add(5, 3); // result = 8

// 在 LINQ 中广泛使用
var numbers = new List<int> { 1, 2, 3, 4 };
var squaredNumbers = numbers.Select(x => x * x); // .Select 方法接收一个 Func<int, TResult>

3.Predicate<T>委托

用于表示一个定义一组条件并判断指定对象是否符合这些条件的方法。它总是返回一个 bool

委托

签名

说明

Predicate<T>

bool Method(T obj)

表示一个接收 T 类型参数并返回 bool 的方法。

示例:

// 使用 Predicate<int> 判断数字是否为偶数
Predicate<int> isEven = (x) => x % 2 == 0;
bool result = isEven(4); // true

// 常用于 List<T> 的方法中,如 FindAll, RemoveAll
List<int> list = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenList = list.FindAll(isEven); // 返回包含 2, 4, 6 的新列表

注意Predicate<T> 在功能上完全等同于 Func<T, bool>。.NET 中一些旧的 API(如 List<T>.FindAll)使用 Predicate<T>,而更新的 API(如 LINQ 的 Where)则使用 Func<T, bool>。在你自己编写代码时,通常更推荐使用 Func<T, bool> 以保持一致性。

下一篇再介绍常用于处理事件的内置委托 EventHandler。

相关文章

成功上岸腾讯运营,教你如何写校招简历?

产品策划/运营的校招简历应该怎么写?作者从自身实际情况出发,总结分享了相关经验,希望对你有用。写在前面红红火火恍恍惚惚,本人是一位2020届本科毕业生,校招意向互联网产品类。此前有过产品相关的项目&a...

IT博物馆之Objective-C诞生(micro博物馆)

1984年,Objective-C诞生。设计者:布莱德·考克斯(Brad Cox)、汤姆·洛夫(Tom Love)Objective-C是面向对象的通用、高级编程语言。它扩展了标准的 ANSI C,将...

记录程序第一天挖漏洞的过程(挖漏洞需要学什么语言)

第一个漏洞复现fastjson漏洞说明:在本地这个fastjson会出现问题复现的过程生成一个java文件进行攻击注入的方式javac Exploit.java但是必须编译成.class文件才能执行p...

微软宣布SQL Server 2016,2005版将结束支持

IT之家讯 在芝加哥Ignite大会上,微软宣布了SQL Server 2016,并将于今年夏季发布公开预览版。SQL Server是由微软开发的关系型数据库管理系统,用于软件应用请求数据的存储和管理...

C语言进阶教程:线程同步:互斥锁、条件变量与信号量

在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。当多个线程需要访问共享资源时,如果缺乏适当的同步机制,就可能导致竞态条件(Race Condition)、死锁(Deadlock)等问题。本...

c++ 继承简介(c++继承的概念)

24.1 — 继承简介2024 年 6 月 5 日在上一章中,我们讨论了对象组合,即从更简单的类和类型构建复杂类。对象组合非常适合构建与其部分具有“has-a”关系的新对象。但是,对象组合只是 C++...