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

文章目录

  • 一、委托是什么?
  • 二、委托简单使用
    • 1.传统委托编写
    • 2.泛型委托Action和Fun
    • 3. Action 详解
    • 4. Fun 详解


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

一、委托是什么?

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用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();
        }

        
    }

.net 泛型委托Action<T>和Fun<TResult>委托浅析_第1张图片

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

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

.net 泛型委托Action<T>和Fun<TResult>委托浅析_第2张图片

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

        
    }

.net 泛型委托Action<T>和Fun<TResult>委托浅析_第3张图片

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

.net 泛型委托Action<T>和Fun<TResult>委托浅析_第4张图片

4. Fun 详解

注:声明一个Func,进入方法,可见底层也是一个委托声明,由关键字delegate,并且是有返回值的
.net 泛型委托Action<T>和Fun<TResult>委托浅析_第5张图片
注:声明一个Func,进入方法,可传入16个参数,重载17个方法
在这里插入图片描述
Action委托(示例代码):

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

在这里插入图片描述

你可能感兴趣的:(.net,.net,core,Visual,Studio,2019,.net,c#,delegate,Fun,Action)