• .net中的各种委托(Delegate、Action、Func)


    1、Delegate,委托的鼻祖

            protected delegate int ClassDelegate(int x, int y);//定义委托类型及参数
            static void Main(string[] args)
            {
                ClassDelegate dele = new ClassDelegate(Add);//实例化一个委托
    
                Console.WriteLine(dele(1, 2));//调用委托
                Console.ReadKey();
            }
    
            static int Add(int a, int b)
            {
                return a + b;
            }

    2、Action,可以传入参数,没有返回值的委托

    方法1,调用方法

            static void Main(string[] args)
            {
                Action<int, int> ac = new Action<int, int>(ShowAddResult);//实例化一个委托
                ac(1, 2);//调用委托
    
                Console.ReadKey();
            }
    
            static void ShowAddResult(int a, int b)
            {
                Console.WriteLine(a + b);
            }

    方法2,使用lambda表达式

            static void Main(string[] args)
            {
                Action<int, int> ac = ((p, q) => Console.WriteLine(p + q));//实例化一个委托
                ac(1, 2);//调用委托
    
                Console.ReadKey();
            }

    方法3,作为参数传

            static void Main(string[] args)
            {
                Action<string> ac = (p => Console.WriteLine("我是方法1,传入值:"+p));//实例化一个委托
                Action<string> ac2 = (p => Console.WriteLine("我是方法2,传入值:" + p));//实例化另一个委托
    
                Test(ac, "参数1");//调用test方法,传入委托参数
                Test(ac2, "参数1");//调用test方法,传入委托参数
    
                Console.ReadKey();
            }
    
            static void Test<T>(Action<T> ac, T inputParam)
            {
                ac(inputParam);
            }

    3、Func,可以传入参数,必须有返回值的委托

     方法1,调用方法

            static void Main(string[] args)
            {
                Func<string> fc1 = new Func<string>(ShowAddResult);//实例化一个委托
                string result = fc1();//调用委托
    
                Console.WriteLine(result);
                Console.ReadKey();
            }
            static string ShowAddResult()
            {
                return "地球是圆的";
            }

    方法2,使用lambda表达式

            static void Main(string[] args)
            {
                //实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
                Func<string> fc1 = () => "地球是圆的";
    
                //实例化另一个委托,注意加大括号后可以写多行代码,但是必须带return
                Func<string> fc2 = () =>
                {
                    return "地球是圆的";
                };
    
                string result = fc1();//调用委托
                string result2 = fc2();//调用委托
    
                Console.WriteLine(result);
                Console.WriteLine(result2);
                Console.ReadKey();
            }

    方法3,作为参数传

            static void Main(string[] args)
            {
                //实例化一个委托,注意不加大括号,写的值就是返回值,不能带return
                Func<int, string> fc1 = (p) => "传入参数" + p + ",地球是圆的";
    
                //实例化另一个委托,注意加大括号后可以写多行代码,但是必须带return
                Func<string, string> fc2 = (p) =>
                {
                    return "传入参数" + p + ",地球是圆的";
                };
    
                string result = Test<int>(fc1, 1);//调用委托
                string result2 = Test<string>(fc2, "1");//调用委托
    
                Console.WriteLine(result);
                Console.WriteLine(result2);
                Console.ReadKey();
            }
    
            static string Test<T>(Func<T, string> fc, T inputParam)
            {
                return fc(inputParam);
            }

    总结:

    Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

    Func可以接受0个至16个传入参数,必须具有返回值

    Action可以接受0个至16个传入参数,无返回值

  • 相关阅读:
    21.满足条件的01序列 卡特兰数
    20.求组合数 IV
    19.求组合数 III
    18.求组合数 II
    17.求组合数 I
    14.表达整数的奇怪方式 中国剩余定理 --------待复习标志--------
    16.高斯消元解异或线性方程组
    15.高斯消元解线性方程组
    writing: improvised lecture
    writing: a lesson about coronavirus epidemic
  • 原文地址:https://www.cnblogs.com/dengshaojun/p/6227316.html
Copyright © 2020-2023  润新知