Action和Func的用法

模拟一下场景:小明最近学习情绪高涨,以前买的书已经满足不了欲望,打算去买本(一个程序员的自我修养)。可是呢以前总是跑书厂买,nm,太远了扛不住,就去跑去附近书店去买,小明去给钱就弄了一本书回来,这个过程就是委托。开始分析

1:小明要买一本一个程序员自我修养的书籍,硬性要求 (这就是要定义委托性质)

private delegate void BuyBook();

2:附近书店 (委托的方法)

public static void Book()
{
    Console.WriteLine("我是提供书籍的");
}

3:小明和书店建立关系(给委托绑定方法) 

BuyBook buyBook = new BuyBook(Book);

4:小明给钱拿书(触发)

buybook();

上面的内容是为了能理解委托的用法下面呢我开始讲解Action和Func

Action的用法

1:小明很是苦恼,我就是买一本书籍,每次都让我定义下,烦死了,有没有一种方法不去定义委托呢,那么有吗,还真有,就是我们今天讲的Action

Action bookAction = Action(Book);
BookAction();

这样是不是就简单了很多

2:小明现在又不满意了,我把一个程序员的自我修养看完了,现在呢想买本其他书,那怎么办,我是不是要重新再次定义委托。其实不需要你只需要把参数穿过来就可以了。下面我们看Action<T>的用法

Action<string> bookAction = new Action<string>(Book);

public static void Book(string bookName)
{
    Console.WriteLine("我买的书是{0}", bookName);
}

3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有,Action<in T1,in T2>

Action<string, string> bookAction = new Action<string, string>(Book);

public static void Book(string bookName, string manufacturers)
{
    Console.WriteLine("我买的书是:{0},来自:{1}", bookName, manufacturers);
}

Func的用法

小明又发生疑问了,每次我自己都去书店去拿书,有没有一种方法直接送到我家里呢,那么Func专门提供了这样的服务

Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的方法。

1:我们先看一个没有参数只有返回值的方法

Func<string> book = new Func<string>(Book);
book();

public static string Book()
{
    return "送书来了";
}

 2:有参数有返回值的方法

Func<string, string> book = new Func<string, string>(Book);
Console.WriteLine(book("基督山伯爵"));//1

public static string Book(string bookName)
{
    string bookId = GetIdByBookName(bookName);
    return bookId;
}

public static string GetIdByBookName(string bookName)
{
    string Id = "0";
    switch(bookName)
    {
        case "基督山伯爵":
            Id = "1";
            break;
        case "茶花女":
            Id = "2";
            break;
    }

    return Id;
}

总结

1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)

2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)

3:记住无返回就用action,有返回就用Func

转载:C#之Action和Func的用法

<think>我们需要详细解释FuncAction用法FuncAction都是C#中的委托类型,用于简化委托的声明使用。它们的主要区别在于: - Action:用于没有返回值的方法。可以有0到16个输入参数。 - Func:用于有返回值的方法。最后一个泛型参数是返回值类型,前面的是输入参数(0到16个)。 我们将分别介绍它们的用法,并给出代码示例。 1. Action用法Action是一个泛型委托,它封装的方法没有返回值(void)。它的泛型参数指定了方法的参数类型。 例如: Action:无参数无返回值的方法。 Action<int>:一个int参数无返回值的方法。 Action<int, string>:两个参数(intstring)无返回值的方法。 2. Func用法Func也是一个泛型委托,它封装的方法有返回值。它的泛型参数中,最后一个参数是返回值类型,前面的都是输入参数。 例如: Func<int>:无参数,返回int的方法。 Func<string, int>:一个string参数,返回int的方法。 Func<int, int, string>:两个int参数,返回string的方法。 下面我们通过代码示例来详细说明。 示例代码: </think>### Func Action用法详解 在 C# 中,**`Func`** **`Action`** 是预定义的泛型委托类型,用于简化委托的使用。它们消除了显式声明委托类型的需要,尤其在 LINQ、异步编程事件处理中广泛应用。 --- #### 1. **`Action` 委托** **作用**:封装无返回值的方法(`void` 方法)。 **泛型参数**:最后一位是返回值类型(无返回值),前 0-16 位是输入参数类型。 ##### 用法示例: ```csharp // 无参数 Action printHello = () => Console.WriteLine("Hello"); printHello(); // 输出: Hello // 带参数 Action<string, int> printDetails = (name, age) => Console.WriteLine($"{name} is {age} years old"); printDetails("Alice", 30); // 输出: Alice is 30 years old ``` --- #### 2. **`Func` 委托** **作用**:封装有返回值的方法。 **泛型参数**:**最后一位是返回值类型**,前 0-16 位是输入参数类型。 ##### 用法示例: ```csharp // 无参数,返回 int Func<int> getRandom = () => new Random().Next(1, 100); Console.WriteLine(getRandom()); // 输出随机数 // 带参数,返回 string Func<int, string, string> formatString = (id, name) => $"ID: {id}, Name: {name}"; Console.WriteLine(formatString(101, "Bob")); // 输出: ID: 101, Name: Bob ``` --- #### 3. **实际应用场景** ##### 场景 1:LINQ 查询 ```csharp List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; Func<int, bool> isEven = x => x % 2 == 0; var evenNumbers = numbers.Where(isEven).ToList(); // 输出: [2, 4] ``` ##### 场景 2:异步编程 ```csharp // 使用 Action 封装回调 Action<string> callback = result => Console.WriteLine($"Result: {result}"); Task.Run(() => LongRunningTask("Data")).ContinueWith(t => callback(t.Result)); string LongRunningTask(string input) => input.ToUpper(); ``` ##### 场景 3:高阶函数(将委托作为参数) ```csharp int ProcessNumbers(Func<int, int, int> operation, int a, int b) => operation(a, b); Func<int, int, int> add = (x, y) => x + y; Func<int, int, int> multiply = (x, y) => x * y; Console.WriteLine(ProcessNumbers(add, 3, 4)); // 输出: 7 Console.WriteLine(ProcessNumbers(multiply, 3, 4)); // 输出: 12 ``` --- #### 关键知识点 1. **参数限制**: `Action` `Func` 最多支持 16 个输入参数(例如 `Func<T1,...,T16, TResult>`)。 2. **返回值差异**: - `Action`:始终返回 `void`。 - `Func`:最后一个泛型参数是返回值类型。 3. **Lambda 表达式**: 两者通常与 Lambda 表达式结合使用,简化匿名方法的编写。 4. **委托兼容性**: 方法签名(参数类型返回值)必须与委托定义完全匹配。 --- #### 常见错误 ```csharp // 错误:Func 必须有返回值,但这里返回 void Func<int, int, void> invalidFunc = (a, b) => Console.WriteLine(a + b); // 编译错误 // 正确:改用 Action Action<int, int> validAction = (a, b) => Console.WriteLine(a + b); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值