C# 理解Func 和 Action 泛型委托 让我们的代码更优雅
- 简化委托声明
特别是对于不同的委托签名,不需要每次都手动声明新的委托。
public void Execute(Action action)
{
action();
}
public T Execute<T>(Func<T> func)
{
return func();
}
- 便于使用匿名方法和Lambda表达式
这使得代码更加简洁,清晰,特别是在需要传递方法作为参数地情况下。
//Lambda表达式 匿名方法 Where接收Func<T,bool>的委托
var filterList=list.Where(a=>a.Status==1);
- 方便地表示方法的输入输出 Func 有返回值 Action没有返回值
Func
Func<> 是一种泛型委托,它返回一个值。Func<> 可以没有或者多个输出参数。Func<>的最后一个类型是返回类型。Func<int,string> 返回字符串。
//这一段写的消费队列消息的代码
//因为不同的队列不同的消费方式采用了委托最终返回是否消费成功
public async Task ReceiveAsync(string queueName, Func<string, bool> func, ushort threadCount = 0)
{
var connection = _connectionFactory.CreateConnection();
var channel = connection.CreateModel();//开辟新的信道通信
channel.BasicQos(0, 0, false);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (sender, ea) =>
{
string str = Encoding.UTF8.GetString(ea.Body.ToArray());
if (func(str))
{
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);//确认已消费
}
else
{
channel.BasicReject(deliveryTag: ea.DeliveryTag, requeue: true);//放回队列--重新包装信息,放入其他队列
}
};
channel.BasicConsume(queue: queueName,
autoAck: false,//不ACK
consumer: consumer);
}
Action
Action 不带有返回值。异步编程中Action常用于完成后的回调函数。
//ContinueWith中的Action
Task.Run(()=>{
A();
})
.ContinueWith(task=>{
CallBack();
});
//List<T>的Foreach
List<string> list=new List<string>();
list.Foreach(a=>a=a);