C#中Lambda表达式的演化过程

151 次浏览次阅读

1.Lambda表达式的演化

public delegate int MydeleAdd(int x);
MydeleAdd add= delegate(int x)      {return x+1;};//匿名方法
MydeleAdd add=         (int x) =>   {return x+1;};//省略delegate 使用=>(goes to) 
MydeleAdd add=             (x) =>   {return x+1;};//省略类型
MydeleAdd add=               x =>   {return x+1;};//省略圆括号
MydeleAdd add=               x =>    x+1;         //省略return 

可以看到Lambda表达式是从委托开始进行一步步进化,最终版本简洁、直观、易用。

C#1.0中加入委托

C# 2.0中,匿名方法被引入作为一种创建委托实例的方式

C#3.0中加入Lambda表达式

C#中的Lambda表达式依赖以下几种主要的技术实现:

  1. 委托:Lambda表达式在C#中是通过委托实现的。委托是一种引用方法的类型,它可以被用来封装一个具有特定的函数签名和返回类型的方法。
  2. 匿名方法:在C# 2.0中引入的匿名方法是Lambda表达式的基础。匿名方法允许我们创建一个没有名字的方法体,并将其赋值给委托。
  3. 类型推断:C#的编译器能够根据上下文推断Lambda表达式的参数类型,这使得我们在编写Lambda表达式时不必显式地指定参数类型。
  4. 表达式树:在C# 3.0及其后续版本中,Lambda表达式可以被编译为表达式树,而不是直接编译为IL代码。表达式树是一种数据结构,它表示一些代码片段,这使得我们可以在运行时操作和修改这些代码片段。
  5. 闭包:在C#中,Lambda表达式可以捕获其作用域内的变量,这是通过闭包实现的。闭包是一种可以捕获和存储其外部作用域中的局部变量的代码结构。

2.委托的定义和示例

委托定义了一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 其参数列表和返回类型匹配的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。 

简单一句话描述就是:将方法当作参数传递的引用 类型被称为委托

using System;
using System.Linq;

public class Program
{
    //定义委托
    public delegate string Reverse(string s);
    
    static string staticReverseString(string s)
    {
        return new string(s.Reverse().ToArray());
    }

    string ReverseString(string s)
    {
        return new string(s.Reverse().ToArray());
    }

    static void Main(string[] args)
    {
        //传递静态方法
        Reverse rev = staticReverseString;
        //传递实例化方法
        Reverse rev2 = new ReverseString;


        Console.WriteLine(rev("a string"));
        Console.WriteLine(rev2("a string"));
    }
}

3.匿名方法

很多时候委托接收的方法是一次性的或者方法体是非常简单的,匿名方法为满足此场景而诞生。顾名思义这类方法的特点是不需要去定义函数的名字

public class SampleAnonymousMethod
{
    static void Main(string[] args)
    {
        Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
        Console.WriteLine(sum(11,22));  
        
        //输出:33
    }
}

4.Func和Action

Func和Action是匿名方法的语法糖Func是有返回值的匿名方法,Action是不具有返回值的匿名方法

正文完
 
马化云
版权声明:本站原创文章,由 马化云 2023-11-22发表,共计1592字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。