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>
是一种特殊的泛型委托,用于定义一个接受单个参数并返回布尔值(true
或 false
)的方法。这种委托通常用于测试某个条件是否成立,因此它在筛选数据、执行条件检查等场景中非常有用。
定义
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
}