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

c#内置委托Action、Func、Predicate

maynowei5个月前 (10-02)技术知识69

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

相关文章

在手机上演示axure原型(怎么在axure中画出手机原型)

AXSHARE APP发布啦,以后大家的原型可以通过这款APP进行预览演示咯。小编迫不及待的体验了一下这款APP。要使用这款APP,首先需要有axshare的账号。账号注册地址:https://sha...

高考一词多义考点! 30个高频词汇,完形填空再也不怕啦

1. address·/a'dres/ v.处理(问题)We must address the issue of climate change.·/'aedres/ n.地址Pleas...

分析 Rust 程序的火焰图(rust火吗)

分析 Rust 程序的火焰图(Flame Graph)是定位性能瓶颈的核心手段,其核心是通过可视化的函数调用栈和时间分布,找到 CPU 耗时、内存分配、锁竞争等热点。以下是详细的分析方法和步骤,结合...

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

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

centos系统安装oracle简易客户端instantclient

一、目录1:centos 环境准备2:instant client 下载3:instant client 安装4:instant client 配置5:测试连接二、安装步骤1:zip,unzip命令安...

Oracle 不是有效的导出文件,标头验证失败 解决方法

第一种:网上搜索到的大多解决方法是说导出文件时使用的Oracle版本不一致问题,需要修改dmp文件的版本号。如果确定版本号确实不一样,请自行搜索一下解决方法。第二种:备份dmp文件时,备份的语句可能使...