zoukankan      html  css  js  c++  java
  • .NET 委托(Delegate、Action、Func)

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

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

    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个传入参数,无返回值

  • 相关阅读:
    Go语言之依赖管理
    Go之NSQ
    Redis相关
    Go语言操作mongoDB
    Go语言操作Redis
    mysql-5.7.22-winx64.zip 安装
    LL(1)文法系列(二)预测分析表
    LL(1)文法系列(三)预测分析程序
    LL(1)文法系列(一)first集和follow集
    算符优先系列之(二)算符优先关系表
  • 原文地址:https://www.cnblogs.com/lqyy/p/11028558.html
Copyright © 2011-2022 走看看