C# 理解Func 和 Action 泛型委托 让我们的代码更优雅

95 阅读1分钟

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);