zoukankan      html  css  js  c++  java
  • 委托 与 Lambda

    一、委托调用方式

    1. 最原始版本:

    复制代码
        delegate string PlusStringHandle(string x, string y);
        class Program
        {
            static void Main(string[] args)
            {
                PlusStringHandle pHandle = new PlusStringHandle(plusString);
                Console.WriteLine(pHandle("abc", "edf"));
    
                Console.Read();
            }
    
            static string plusString(string x, string y)
            {
                return x + y;
            }
        }
    复制代码

     2. 原始匿名函数版:去掉“plusString”方法,改为

                PlusStringHandle pHandle = new PlusStringHandle(delegate(string x, string y)
                {
                    return x + y;
                });
                Console.WriteLine(pHandle("abc", "edf"));

    3. 使用Lambda(C#3.0+),继续去掉“plusString”方法(以下代码均不再需要该方法)

                PlusStringHandle pHandle = (string x, string y) =>
                {
                    return x + y;
                };
                Console.WriteLine(pHandle("abc", "edf"));

    还有更甚的写法(省去参数类型)

                PlusStringHandle pHandle = (x, y) =>
                {
                    return x + y;
                };
                Console.WriteLine(pHandle("abc", "edf"));

    如果只有一个参数

    复制代码
            delegate void WriteStringHandle(string str);
            static void Main(string[] args)
            {
                //如果只有一个参数
                WriteStringHandle handle = p => Console.WriteLine(p);
                handle("lisi");
    
                Console.Read();
            }
    复制代码

    二、委托声明方式

    1. 原始声明方式见上述Demo

    2. 直接使用.NET Framework定义好的泛型委托 Func 与 Action ,从而省却每次都进行的委托声明。

    复制代码
            static void Main(string[] args)
            {
                WritePrint<int>(p => Console.WriteLine("{0}是一个整数", p), 10);
    
                Console.Read();
            }
    
            static void WritePrint<T>(Action<T> action, T t)
            {
                Console.WriteLine("类型为:{0},值为:{1}", t.GetType(), t);
                action(t);
            }
    复制代码

    3. 再加上个扩展方法,就能搞成所谓的“链式编程”啦。

    复制代码
        class Program
        {   
            static void Main(string[] args)
            {
                string str = "所有童鞋:".plusString(p => p = p + " girl: lisi、lili
    ").plusString(p => p + "boy: wangwu") ;
                Console.WriteLine(str);
    
                Console.Read();
            }
        }
    
        static class Extentions
        {
            public static string plusString<TParam>(this TParam source, Func<TParam, string> func)
            {
                Console.WriteLine("字符串相加前原值为:{0}。。。。。。", source);
                return func(source);
            }
        }
    复制代码

    看这个代码是不是和我们平时写的"list.Where(p => p.Age > 18)"很像呢?没错Where等方法就是使用类似的方式来实现的。


    原文出处:http://www.cnblogs.com/FreeDong/p/3227638.html

  • 相关阅读:
    2013腾讯编程马拉松初赛第〇场(3月20日)湫湫系列故事——植树节 HDOJ 4503
    组合模式(Composite)
    Git Push 避免用户名和密码方法
    [Yii2] 快速套模板,加载JS,CSS(HTML标签<base>)
    phpstorm 2016.2.x 最新版激活方法
    PHP实现四种基本排序算法
    linux下查看负载均衡的两种方法
    Redis各类型应用场景
    HTTP协议2:请求、响应、缓存 2017-03-16 11:20 197人阅读 评论(0) 收藏
    HTTP协议1:工作原理 2017-03-16 11:18 39人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/mane/p/3229670.html
Copyright © 2011-2022 走看看