C# Action和Func委托

简单理解:Action和Func都可以实现委托,Action是无返回值的委托,Func是有返回值的委托。 代码:
        private void btnRun_Click(object sender, RoutedEventArgs e)
        {
            //Action 调用
            Action act = new Action(InitData);              //无参调用
            act();
            Action<int> act2 = new Action<int>(SetData);    //有参调用
            act2(0);

            //Func 调用,Func最后一个泛型类型参数为返回值类型
            Func<int> func1 = new Func<int>(GetData);       //无参有返回值
            int data = func1();
            Func<string, int> func2 = new Func<string, int>(Caculate);    //一个参数有返回值
            int len = func2("test");
            Func<string, string, int> func3 = new Func<string, string, int>(SubLength); //两个参数一个返回值
            int len2 = func3("test1", "test2");
        }

        void InitData()
        {
            /*****
             * 
             * ******/
        }

        void SetData(int data)
        {
            /*****
            * 
            * ******/
        }

        int GetData()
        {
            /*****
           * 
           * ******/

            return 0;
        }

        int Caculate(string data)
        {
            return data.Length;
        }

        int SubLength(string data1, string data2)
        {
            return data1.Length + data2.Length;
        }

以下内容完全转载至C#之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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#ActionFunc是两种常用的委托类型。Action是一个没有返回值的委托,而Func是一个有返回值的委托。\[1\] 在代码示例使用FuncAction来定义委托并执行相应的方法。Func可以定义带有不同参数和返回值类型的委托,而Action只能定义带有参数但没有返回值的委托。\[1\] 在示例,MyFun1是一个无参的Func委托,返回一个string值。MyFun2是一个带有一个string参数的Func委托,返回一个string值。MyFun3是一个带有两个string参数的Func委托,返回一个bool值。\[1\] 另外,示例还展示了使用Action来定义委托的写法。在Start方法使用Action定义了一个带有一个string参数的委托act,并执行了Init方法。\[2\] 此外,还可以使用Lambda表达式来创建委托。Lambda表达式可以简化委托的定义和使用。在示例使用Lambda表达式创建了一个带有一个string参数的Action委托。\[3\] 总结来说,ActionFuncC#常用的委托类型,用于定义不同参数和返回值类型的委托Action用于定义没有返回值的委托,而Func用于定义有返回值的委托。可以使用Lambda表达式来简化委托的定义和使用。 #### 引用[.reference_title] - *1* *2* [c#ActionFunc(简单用法)](https://blog.csdn.net/qq_39984000/article/details/115245134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C#语法:C# 简述Actionfunction内置委托用法、Lambda 表达式创建委托最为方便](https://blog.csdn.net/qq_37271216/article/details/102801792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值