C#中的委托

ops/2024/11/15 0:57:04/

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
}


http://www.ppmy.cn/ops/111682.html

相关文章

item_get京东获取商品详情SKU数据接口||关于京东商品采集接口

jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默…

pdf转jpg工具分享,4款搞定90%的PDF转格式

PDF转换真的是要学会的技能&#xff0c;我最近遇到了一个难题&#xff1a;我需要将一些PDF文件转换成JPG格式&#xff0c;以便在不同的设备上查看和编辑。我尝试了几个不同的工具&#xff0c;今天&#xff0c;我就来和大家分享一下我的使用体验&#xff0c;希望能帮到和我一样在…

matlab while (~feof(fid))语句解释

这行 MATLAB 代码是一个 while 循环&#xff0c;结合 feof 函数用于读取文件直到文件结束。 解释 while 循环 while 是一个循环语句&#xff0c;表示当条件为真时&#xff0c;循环内的代码会反复执行。在这个例子中&#xff0c;循环将持续执行&#xff0c;直到 feof(fid) 返回…

求n至少为多大时,n个1组成的整数能被2013整除

题目&#xff1a;编写程序&#xff0c;求n至少为多大时&#xff0c;n个1组成的整数能被2013整除 #include<iostream> using namespace std; int main(){int n1;int m1;while(m%2013!0){m(m%2013)*101;n;}cout<<n<<endl;return 0; } 思路&#xff1a;直接用n…

Java面试题——第七篇(Java Web)

1.forward和redirect区别 forward和redirect代表了两种请求转发方式&#xff1a;直接转发和间接转发 直接转发方式&#xff08;forward&#xff09;&#xff1a;客户端和浏览器只发出一次请求&#xff0c;服务器在处理这个请求的过程中&#xff0c;将请求转发给另一个资源或组件…

关于less的基本使用

1、介绍及概述 1.1、解释 less 是方便开发人员书写CSS的一门预处理语言。浏览器只认识html /css /js格式的文件&#xff0c;所以直接引入.less文件&#xff0c;没有任何的效果&#xff0c;需要把less文件转换成css文件 1.2、概述 CSS弊端&#xff1a; 没有逻辑性、变量、函…

C++中string类的使用

目录 1.auto和范围for 1.1auto关键字 1.2范围for 2.string类常用接口说明 2.1默认成员函数 2.1.1构造函数(constructor) 2.1.2赋值运算符重载(operator()) 2.2string类对象的访问及遍历操作(Iterators and Element access) 2.3string类对象的容量操作(Capacity) 2.3.1…

Python Web应用的测试技巧

Python Web应用的测试技巧 目录 &#x1f3af; 单元测试与集成测试的基础与区别&#x1f527; 使用 pytest 进行高效测试&#x1f6e0;️ Flask 和 Django 的内置测试框架详解&#x1f680; 使用 tox 实现跨环境测试&#x1f9ea; Mock 和 Faker 在测试中的应用技巧 &#x1…