C# action,delegate,func的用法和区别

C#中Action和Func委托的用法
本文作者原本用delegate写委托,学习了外国人用action和func写委托的方式,发现代码更简洁。通过小明买书的场景解释委托用法,重点讲解了Action和Func的用法,指出Action用于无返回值方法,Func用于有返回值方法。

以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。这两种方式我们也可以去实践的过程去慢慢运用。

先说一下委托:

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

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

代码:

 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 = new Action(Book);
BookAction();


这样是不是就简单了很多

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

       static void Main(string[] args)
        {
            Action<string> BookAction = new Action<string>(Book);
            BookAction("百年孤独");
        }

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


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

       static void Main(string[] args)
        {
            Action<string,string> BookAction = new Action<string,string>(Book);
            BookAction("百年孤独","北京大书店");
        }

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


Func的用法

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

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

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

        static void Main(string[] args)
        {
            Func<string> RetBook = new Func<string>(FuncBook);
            Console.WriteLine(RetBook);
        }

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


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

static void Main(string[] args)
{
    Func<string,string> RetBook = new Func<string,string>(FuncBook);
    Console.WriteLine(RetBook("aaa"));
}

public static string FuncBook(string BookName)
{
    return BookName;
}


3:Func一个很重要的用处就是传递值,下面我举一个简单的代码来说明

            Func<string> funcValue = delegate
            {
                return "我是即将传递的值3";
            };

            DisPlayValue(funcValue);


注释1:DisplayVaue是处理传来的值,比喻缓存的处理,或者统一添加数据库等

        private static void DisPlayValue(Func<string> func)
        {
            string RetFunc = func();
            Console.WriteLine("我在测试一下传过来值:{0}",RetFunc);
        }


总结

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

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

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

 

 

原文地址:https://www.cnblogs.com/772933011qq/p/6369381.html

<think>首先,用户的问题是:“我想了解C#FuncAction等方法对象的区别 请问C#FuncAction等方法对象的区别”。这直接从标题中提取,所以我需要专注于解释FuncAction委托之间的区别。 我的角色是基于系统指令回答: - 所有行内数学表达式使用$...$格式,但这里没有数学内容,所以可能不需要。 - 独立公式使用$$...$$格式,但同样,这个话题是关于C#编程的,不涉及数学公式。 - LaTeX语法正确:确保如果使用LaTeX,语法是正确的。 - 使用中文回答:整个响应必须是中文。 - 生成相关问题:在回答后生成相关问题。 - 引用标识:如果在回答中引用段落,添加引用标识如[^1]。 参考用户提供的引用: - 引用[1]:解释ActionFunc委托允许将方法作为参数传递,提高灵活性。 - 引用[2]:提到ActionFunc是泛型委托,几乎可以替代所有委托类型;Func有返回值,Action没有。 - 引用[3]:明确指出Func返回结果,Action不返回结果。 - 引用[4]:给出Func的示例,用于传递值。 - 引用[5]:展示FuncAction的使用代码。 用户上一次的问题我的回答:没有提供历史上下文,所以在响应中不需要引用之前的回答。主要基于当前查询。 关键点解释FuncAction区别: - **Action 委托**:用于表示没有返回值的方法。它是一个泛型委托,可以有0到16个输入参数。例如,`Action<T>`表示有一个输入参数的方法,没有返回值。 - **Func 委托**:用于表示有返回值的方法。它也是泛型委托,可以有0到16个输入参数,但必须有返回值。最后一个类型参数是返回类型。例如,`Func<T, TResult>`表示有一个输入参数的方法,返回TResult类型。 - **其他方法对象**:用户提到“等方法对象”,可能包括Predicate或自定义委托,但引用中强调ActionFunc足以覆盖大多数情况。 结构化回答: 1. **介绍**:简述ActionFunc是什么,为什么重要。 2. **主要区别**: - Action:无返回值。 - Func:有返回值。 - 参数数量:两者都支持多个参数。 - 泛型特性:都是泛型委托。 3. **使用示例**:提供简单代码示例来说明区别。 4. **总结**:强调核心差异。 5. **相关问题**:结束时生成相关问题。 确保回答真实可靠:基于引用内容构建。 - 引用[3]说:“Func<> Action<> 都是委托!!! 委托:顾名思义, 委托办理,委托一个方法去处理我的东西,然后得到我要的结果(Func<>),或者不要结果,仅仅是去处理(Action<>)” - 引用[2]说:“这些泛型委托分为FuncAction中,它们借助于泛型特性,可以替代C#中几乎所有的委托类型” 使用中文回答:整个响应用中文。 生成相关问题:在最后添加“§§相关问题§§”,然后列出几个相关问题。 最终响应结构: - 开头解释。 - 代码块示例(如果需要)。 - 总结。 - 相关问题。 </think>在C#中,`Func``Action`是两种内置的泛型委托delegate),它们允许将方法作为参数传递,从而实现代码的灵活性重用性。尽管两者都用于封装方法,但它们在功能使用场景上有本质区别。以下是基于引用内容的详细解释,确保回答真实可靠[^2][^3][^4]。 ### 1. **核心区别概述** - **`Action`委托**: - 用于表示**没有返回值**(返回类型为`void`)的方法。 - 支持0到16个输入参数(例如,`Action`表示无参数方法,`Action<T>`表示一个参数方法)。 - 适用场景:执行操作而不关心结果,如事件处理或日志记录。 - 示例:委托一个方法打印信息,但无需返回数据[^1][^3]。 - **`Func`委托**: - 用于表示**有返回值**的方法。 - 支持0到16个输入参数,但最后一个类型参数必须是返回值类型(例如,`Func<TResult>`表示无参数但返回`TResult`的方法,`Func<T, TResult>`表示一个参数并返回`TResult`的方法)。 - 适用场景:需要获取方法执行结果的场景,如数据处理或计算。 - 示例:委托一个方法计算数值并返回结果[^2][^4]。 关键差异总结: - `Action`不返回任何值(`void`),而`Func`必须有返回值。 - 两者都是泛型委托,可以替代大多数自定义委托类型,简化代码[^2][^3]。 ### 2. **具体示例说明** 下面通过C#代码演示两者的区别,代码基于引用[^4][^5]中的实例修改,确保简洁易懂。 ```csharp // 示例1:使用 Action(无返回值) Action<string> printMessage = (message) => { Console.WriteLine(message); // 执行操作,但不返回结果 }; printMessage("Hello Action!"); // 输出:Hello Action! // 示例2:使用 Func(有返回值) Func<int, int, int> addNumbers = (a, b) => { return a + b; // 执行操作并返回结果 }; int sum = addNumbers(3, 5); // 返回值:8 Console.WriteLine($"Sum: {sum}"); // 输出:Sum: 8 // 示例3:组合使用(传递委托作为参数) void ExecuteOperation(Action action, Func<int> func) { action(); // 执行无返回的操作 int result = func(); // 执行并获取返回值 Console.WriteLine($"Result: {result}"); } // 调用 ExecuteOperation( () => Console.WriteLine("Action executed"), // Action 示例 () => 42 // Func 示例,返回42 ); // 输出: // Action executed // Result: 42 ``` 在这个示例中: - `Action`用于执行打印操作,但不返回任何值。 - `Func`用于执行计算并返回结果。 - 两者都可以作为参数传递给其他方法,体现了委托的灵活性[^1][^4]。 ### 3. **为什么使用它们?** - **优势**: - **减少代码冗余**:避免定义多个自定义委托类型,直接用`Action`或`Func`简化[^2]。 - **支持Lambda表达式**:结合Lambda写法,使代码更简洁(如示例中的`(a, b) => a + b`)。 - **增强抽象能力**:允许方法处理各种数据类型操作,提升代码复用性[^1][^4]。 - **注意事项**: - `Func`适用于需要结果的场景(如数据转换),`Action`适用于纯副作用操作(如UI更新)。 - 在性能敏感场景中,委托调用可能比直接方法调用稍慢,但通常可忽略不计[^5]。 ### 4. **总结** `Action``Func`的核心区别在于**返回值的有无**:`Action`专注于执行操作(无返回值),`Func`专注于计算并返回结果(有返回值)。两者都是C#中强大的委托工具,借助泛型特性,可以覆盖绝大多数方法封装需求,提高代码的可读性可维护性[^2][^3][^4]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值