zoukankan      html  css  js  c++  java
  • 浅析C#之委托、Action、Func

    一、委托

    1.1 委托的定义

    delegate(委托)是一种可用于封装命名方法或匿名方法的引用类型, 委托类似于 C++ 中的函数指针;
    .Net通过委托来提供回调函数机制。

    声明一个委托类型
    internal delegate void Feedback(Int32 value);

    一个简单的实例

    namespace CLRExer.Delegates
    {
        //委托定义
        public delegate void FeedBack(int input);
    
        public class SimpleDelegateDemo
        {
            public void Excute()
            {
                FeedBack fb = new FeedBack(DoNothing);
                fb(1);
                //fb.Invoke(1);
            }
    
            /// <summary>
            /// 被调用的方法
            /// </summary>
            /// <param name="input"></param>
            private void DoNothing(int input)
            {
                Console.WriteLine("input is {0};", input);
            }
        }
    }
    

    运行结果:

    可以看到委托的使用:用C#的delegate定义一个委托,用new操作符构造委托实例,最后用方法调用回调函数,执行成功

    为了使用方便,.net framework提供了委托的包装类,Action和Func,是C#的语法糖。

    二、Action

    Action是无返回值的委托,.net framework提供了17个Action委托,他们从无参到最多16个参数;
    几个简单的例子:

    2.1 无输入参数无返回值的委托
    Action action= () => { };

    2.2 一个输入参数无返回值的委托
    Action<int> ac = x => Console.WriteLine("this is {0}", x);

    2.3 多个输入参数的委托

         Action<int, int, int> action2= InputDemo;
         action2(1, 2, 3);
         private void InputDemo(int input1, int input2, int input3)
           {
               Console.WriteLine("this is input1:{0},this is input2:{1},this is input3:{2}", input1, input2, input3);
           }
    

    三、Func

    Func是有返回值的委托,.net framework同样提供了17个Func委托,他们从无参到最多16个参数;
    3.1 无输入参数,有一个返回值的委托
    Func<long> func1 = () => { return 1; };

    3.2 一个输入参数,有一个返回值的委托

    //表示一个输入参数n,一个返回值sum
    Func<long, long> func2 = n => {
        Int64 sum = 0;
        for (; n > 0; n--) {
            checked {
                sum += n;
            }
        }
        return sum;
    };
    

    四、小结

    1、委托可以理解为方法的指针,指向一个方法;
    2、Action和Func也是委托,是.net framework提供的包装委托,经常和lambda表达式一起使用;
    3、当无返回值时,使用Action;当有返回值时,使用Func。
  • 相关阅读:
    mysql数据库表中判断字段是否存在,如果不存在则创建该字段
    PHP同时操作两个mysql数据库
    Bootstrap-分页插件Paginator
    NLP--自然语言处理与机器学习会议
    对CURL的一些研究
    Nginx完整配置说明
    SecureCRT自动登陆到服务器的脚本以及脚本编写简单说明
    Fast CGI 工作原理
    FastCGI中文规范
    Linux +apache+fastcgi运行c/c++
  • 原文地址:https://www.cnblogs.com/zqllove/p/8617482.html
Copyright © 2011-2022 走看看