.net 泛型委托Action<T>和Fun<TResult>委托浅析


博主文章仅用于学习、研究和交流目的,不足和错误之处在所难免,希望大家能够批评指出,博主核实后马上更改。

一、委托是什么?

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。我们知道委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)中的对象的引用。那它保存的是对什么的引用呢?委托保存的是对函数(function)的引用,在C#中使用delegate关键字定义委托,然后使用我们熟悉的函数调用的语法来调用委托。

二、委托简单使用

1.传统委托编写

无返回值委托(示例代码):

class Program
    {   //定义一个无返回值的委托
        public delegate void DelegateNoReturn(int s1, int s2);
       
        public static  void NoReturn(int s1, int s2)
        {
            Console.WriteLine(s1 + s2);
        }
       
        static void Main(string[] args)
        {
            DelegateNoReturn d1;
            d1 = NoReturn;
            d1(1, 2);
            Console.ReadLine();
        }

        
    }

在这里插入图片描述

有返回值委托(示例代码):

 class Program
    {   
//定义一个无返回值的委托
        public delegate void DelegateNoReturn(int s1, int s2);
        //定义一个有返回值的委托
        public delegate string DelegateHaveReturn(string s1, string s2);
        public static  void NoReturn(int s1, int s2)
        {
            Console.WriteLine("无返回值的委托:"+(s1 + s2));
        }
        public static string HaveReturn(string s1, string s2)
        {
            return "有返回值的委托:" + s1 + s2;
        }
        static void Main(string[] args)
        {
            DelegateNoReturn d1;
            DelegateHaveReturn d2;
            d1 = NoReturn;
            d2 = HaveReturn;
            d1(1, 2);
            var a = d2("zhang", "san");
            Console.WriteLine(a);
            Console.ReadLine();
        } 
    }

在这里插入图片描述

2.泛型委托Action和Fun

注: Action和Fun两个委托的不同点:
Action只能委托必须是无返回值的方法
Fun只是委托必须有返回值的方法

Action/Fun委托(示例代码):

class Program
    {   //定义一个无返回值的委托
        public delegate void DelegateNoReturn(int s1, int s2);
        //定义一个有返回值的委托
        public delegate string DelegateHaveReturn(string s1, string s2);
        public static  void NoReturn(int s1, int s2)
        {
            Console.WriteLine("无返回值的委托:"+(s1 + s2));
        }
        public static string HaveReturn(string s1, string s2)
        {
            return "有返回值的委托:" + s1 + s2;
        }
        static void Main(string[] args)
        {
            DelegateNoReturn d1;
            DelegateHaveReturn d2;
            d1 = NoReturn;
            d2 = HaveReturn;
            d1(1, 2);
            var a = d2("zhang", "san");
            Console.WriteLine(a);
            Console.WriteLine("===========Action/Func演示=========================");
            Action<int,int> action = NoReturn;
            action(1, 2);
            Func<string, string,string> func = HaveReturn;
            Console.WriteLine(func("zhang","san"));
            Console.ReadLine();
        }

        
    }

在这里插入图片描述

3. Action 详解

注:声明一个Action,进入方法,可见底层也是一个委托声明,由关键字delegate
在这里插入图片描述
注:声明一个Action,进入方法,可传入16个参数,重载16个方法
在这里插入图片描述
Action委托(示例代码):

           //Action示例代码
            Action<int, string> action1 = (int a1, string b1) =>
            {
                Console.WriteLine("Action演示:" + a1 + b1);
            };
            //调用
            action1(1, "2");

在这里插入图片描述

4. Fun 详解

注:声明一个Func,进入方法,可见底层也是一个委托声明,由关键字delegate,并且是有返回值的
在这里插入图片描述
注:声明一个Func,进入方法,可传入16个参数,重载17个方法
在这里插入图片描述
Action委托(示例代码):

       //Func示例代码
            Func<int, string> func1 = (int a1) =>
            {
               return a1.ToString();
            };
            //调用
            Console.WriteLine("Func演示:" + func1(1));
            

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值