zoukankan      html  css  js  c++  java
  • Linq之Lambda表达式初步认识

    匿名方法

      匿名方法顾名思义,是没有名字的方法,但是仍有方法体,仍能干活。在很多地方可能你都见过它,比如js中,用的最多!

      看看Msdn给的说法:

    在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。 不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。 有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。 您可使用匿名方法来忽略参数列表。 这意味着匿名方法可转换为具有各种签名的委托。 这对于 Lambda 表达式来说是不可能的。

      一个例子

    namespace Wolfy.LinqDemo
    {
        /// <summary>
        /// 创建一个委托Del
        /// </summary>
        /// <param name="x">参数</param>
        public delegate void Del(int x);
        class Program
        {
            static void Main(string[] args)
            {
                //使用匿名方法创建一个委托对象d
                Del d = delegate(int x)
                {
                    Console.WriteLine(x);
                };
            }
        }
    }

    通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。

      例如,线程类即可创建一个线程并且包含该线程执行的代码。

                 Thread thread = new Thread(
                     delegate()
                     {
                         //方法体
                         Console.WriteLine("Hello world");
                     });

      可以更直白的这样理解,如果该方法就使用那么一次,那么就可以使用匿名方法。

      Lambda

      定义

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数

    若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。

      一个例子

    /// <summary>
        /// 创建一个委托Del
        /// </summary>
        /// <param name="x">参数</param>
        public delegate void Del(int x);
        class Program
        {
            static void Main(string[] args)
            {
                Del del = x => Console.WriteLine(x * x);
                del(2);//4
                Console.Read();
            }
        }

      若要创建表达式目录树,可以这样:

    /// <summary>
        /// 创建一个委托Del
        /// </summary>
        /// <param name="x">参数</param>
        public delegate void Del(int x);
        class Program
        {
            static void Main(string[] args)
            {
                Del del = x => Console.WriteLine(x * x);
                del(2);//4
                System.Linq.Expressions.Expression<Del> expression = x => Console.WriteLine(x);
                Console.Read();
            }
        }

      上面的例子创建了一个表达式目录树对象expression,由于Del委托是没有返回值的,这里是将其直接输出。

      表达式Lambda

      表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。表达式 lambda 会返回表达式的结果,并采用以下基本形式:

    (input parameters) => expression

      注意:仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:

     (x, y) => x == y
                 //有时,编译器难以或无法推断输入类型。 如果出现这种情况,你可以按以下示例中所示方式显式指定类型
                 (int x, string s) => s.Length > x
                 //使用空括号指定零个输入参数
                 () => SomeMethod()

      语句Lambda

      语句 lambda 与表达式 lambda 表达式类似,只是语句括在大括号中

     (input parameters) => {statement;}

      statement(语句Lambda)可以包含任意数量的语句,但通常不会多于两个或三个。

      一个例子

    namespace Wolfy.LinqDemo
    {
        /// <summary>
        /// 创建一个委托Del
        /// </summary>
        /// <param name="x">参数</param>
        public delegate void Del(string strName);
    
        class Program
        {
            static void Main(string[] args)
            {
                Del d = x =>
                {
                    string s = "Hello" + " " + x;
                    Console.WriteLine(s);
                };
                d("wolfy");
                Console.Read();
            }
        }
    }

    注意

    像匿名方法一样,语句 lambda 也不能用于创建表达式目录树

      总结

      这里对Lambda及匿名方法做了一个简单介绍。虽然在项目中也经常使用,但是对Lambda的基础知识,还是需要补一补。

  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/gc2013/p/4597537.html
Copyright © 2011-2022 走看看