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

c#内置委托Action、Func、Predicate

maynowei8个月前 (10-02)技术知识110

在 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。

相关文章

PM小技术:使用SAE发布在线Axure文档

俗话说,不会写代码的产品经理不是好的射鸡湿。关于产品经理与技术之间的微妙关系,扯开了讲可是长篇大论,比如知乎上这个问题:IT 行业产品经理(尤其是创业的)需要懂技术吗?懂到什么程度?,以及这个:产品经...

Django 官方推荐的姿势:类视图(django类视图和函数视图哪个好)

作者:HelloGitHub-追梦人物在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑是一样的。比如一个博客和一个论坛,通常其首页都是展示一系列的文章列表或者帖子列表。对处理...

一文弄懂 GO 的 互斥锁 Mutex !(互斥锁的使用方法)

在 Go 语言并发编程中,互斥锁(Mutex)是一个非常重要的同步原语。本文将深入介绍 Mutex 的使用方法、实现原理以及最佳实践。1. 什么是 Mutex?Mutex(互斥锁)是一种用于多线程编程...

掌握C语言多线程:高效并发编程指南

一、多线程基础概念介绍多线程编程是现代软件开发中提高程序性能和响应性的重要技术。在C语言中,pthread(POSIX Threads)库是实现多线程编程的标准工具。本节将通俗易懂地介绍多线程的核心概...

从 async/await 到虚拟线程:Python 并发的再思考

演进之路:从async/await到线程的反思首先必须明确的是,async/await对Python并非全无裨益:它最大的价值,是让更多人接触到了并发编程。通过在编程语言中嵌入语法元素,并发编程的门槛...

Oracle数据库无法连接问题排查(oracle数据库连接不成功)

数据库告警日志 如下图 。发现 问题时间段,没有 数据库服务故障 报错,但是存在较多 TNS-12535 、 12560 、 12170 、 00505 错误:通过检查问题时间段应用日志, 也记录了...