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

c#内置委托Action、Func、Predicate

maynowei7个月前 (10-02)技术知识86

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

相关文章

Shopee新手指南:Shopee卖家中心用户界面介绍

1.Shopee各站点前台网页链接:2.Shopee各站点后台网页链接3.Shopee APP下载:安卓版下载链接:https://pan.baidu.com/s/1eSp8M1k#list/path...

C++ 原子操作与锁的深度解析:为什么原子操作并非万金油?

大噶好,我是henry,今天来和大家浅浅聊一下为啥C++原子操作并非万能钥匙,原因有三,且听我娓娓道来:一、原子操作的线程安全性C++11 的 std::atomic 确实为单个变量的线程安全操作提供...

C语言编写多线程,什么时候要使用互斥锁?为什么要使用互斥锁?

在多线程编程中,当多个线程同时访问共享资源(如变量、文件等)时,会出现竞态条件(Race Condition)问题,导致程序的行为不可预测。为了避免这种问题,需要使用互斥锁来保护共享资源的访问。互斥锁...

如何在Go中同步线程(go语言同步锁)

单线程代码已经带来头痛。添加第二个线程,就是从基础头痛升级了。解决方案?互斥锁:线程和数据的交通警察。一旦你理解了它们,线程同步就变成了第二本能,语言无关。在C++和Go中工作,我遇到过所有常见的混乱...

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

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

Oracle标准化部署手册(oracle19c客户端)

很久之前写过一篇11g的windows安装手册, 这次是19c的windows安装手册,面向没有数据库安装部署经验的开发人员或想学习数据库的新手。希望能给想从事dba的入门人员小小的帮助。 毕竟每个高...