基础知识---委托和 lambda

委托定义类型,类型指定特定方法签名。 可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。 以下示例演示了委托的用法。

using System;
using System.Linq;

public class Program
{
    public delegate string Reverse(string s);

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

    static void Main(string[] args)
    {
        Reverse rev = ReverseString;

        Console.WriteLine(rev("a string"));
    }
}
  • public delegate string Reverse(string s); 行创建特定签名的委托类型,在本例中即接受字符串参数并返回字符串参数的方法。
  • static string ReverseString(string s) 方法与定义的委托类型具有完全相同的签名,用于实现委托。
  • Reverse rev = ReverseString; 行显示可将方法分配给相应委托类型的变量。
  • Console.WriteLine(rev("a string")); 行演示如何使用委托类型的变量来调用委托。

为简化开发过程,.NET 包含一组委托类型,程序员可重用这些类型而无需创建新类型。 其中包括 Func<>Action<> 和 Predicate<>,可用于 .NET API 的各个位置,无需定义新委托类型。 当然,从这三者的签名可以看出它们之间存在某些差异,主要影响其既定用途:

  • Action<> 用于需要使用委托参数执行操作的情况。
  • Func<> 通常用于现有转换的情况,也就是说需要将委托参数转换为其他结果时。 最好的示例就是投影。
  • Predicate<> 用于需要确定参数是否满足委托条件的情况。 也可将其写作 Func<T, bool>

现在可使用 Func<> 委托而非自定义类型重新编写上述示例。 程序将照旧继续运行。

using System;
using System.Linq;

public class Program
{
    static string ReverseString(string s)
    {
        return new string(s.Reverse().ToArray());
    }

    static void Main(string[] args)
    {
        Func<string, string> rev = ReverseString;

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

对于此简单示例而言,在 Main 方法之外定义方法似乎有些多余。 因此 .NET Framework 2.0 引入了匿名委托的概念。 在其支持下,可创建“内联”委托,而无需指定任何其他类型或方法。 只需在所需位置内联委托的定义即可。

例如,要进行切换并使用匿名委托筛选出只有偶数的列表,然后将其打印到控制台。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> list = new List<int>();

        for (int i = 1; i <= 100; i++)
        {
            list.Add(i);
        }

        List<int> result = list.FindAll(
          delegate (int no)
          {
              return (no % 2 == 0);
          }
        );

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }
}

如你所见,该委托的正文只是一组表达式,其他所有委托也是如此。 但它并非单独定义,而是在调用List<T>.FindAll 方法时临时引入。

但是,即使使用此方法,仍有许多可以丢弃的代码。 此时就需要使用 lambda 表达式。

lambda 表达式(或简称“lambda”)在 C# 3.0 中作为语言集成查询的 (LINQ) 核心构建基块被首次引入。 这种表达式只是使用委托的更方便的语法。 它们将声明签名和方法正文,但在分配到委托之前没有自己的正式标识。 与委托不同,可将其作为事件注册的左侧内容或在各种 LINQ 子句和方法中直接分配。

由于 lambda 表达式只是指定委托的另一种方式,因此应可重新编写上述示例,令其使用 lambda 表达式而不是匿名委托。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main(string[] args)
    {
        List<int> list = new List<int>();

        for (int i = 1; i <= 100; i++)
        {
            list.Add(i);
        }

        List<int> result = list.FindAll(i => i % 2 == 0);

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }
}

在前面的示例中,所使用的 Lambda 表达式为 i => i % 2 == 0。 再次强调,它只是使用委托的一种非常方便的语法,因此其实际行为与使用匿名委托时相同。

再次强调,lambda 只是委托,这意味着可将其顺利用作事件处理程序,如以下代码片段所示。

public MainWindow()
{
    InitializeComponent();

    Loaded += (o, e) =>
    {
        this.Title = "Loaded";
    };
}

此上下文中的 += 运算符用于订阅事件。

(0)

相关推荐

  • Lambda表达式

    记录 Lambda. 两种显示形式: // 第一种:表达式Lambda,右边主体为表达式. (parameters) => expression // 第二种:语句Lambda,右边主体为语句块 ...

  • 一探即将到来的 C# 10

    hez2010 dotNET跨平台 今天 前言 本来因为懒不想写这篇文章,但是不少人表示有兴趣,于是最后决定还是写一下. .NET 6 最近几个预览版一直都在开发体验(如 hot reload.lin ...

  • 易学应用基础知识之八:《奇门遁甲》中十二地支的相互关系

    这一部分内容,我们来介绍关于十二地支的相互关系. 关于十二地支之间的相互关系,在其它传统预测学中的应用是比较广泛的,比如八字.六爻等.在奇门遁甲中,十二地支之间的各种相互关系并不是所有的关系都能用得上 ...

  • 事业单位公共基础知识:人文常识之楚辞

    在各种考试中,一般都会涉及一些人文常识的题目,考查方式主要以识记性为主,但由于考察内容涉及的知识范围较广.例如一些文学著作知识,对于很多考生来说部分题目还是比较难.现就文学著作中的楚辞的部分知识梳理如 ...

  • 88张PPT带你学习PLC基础知识,不看你就亏了!

    电气达人 电气人择一业,终一生! 13篇原创内容 公众号 电气达人 电气人择一业,终一生! 13篇原创内容 公众号 电气达人 电气人择一业,终一生! 13篇原创内容 公众号 电气达人 电气人择一业,终 ...

  • 运维必知必备!73页计算机基础知识,新手小白也能轻松读懂

    基础不牢,地动山摇! 新手在学习运维亦或是开发的时候,都要注重基础知识的积累,不能只想着学习实战知识,这样到中后期,容易造成对"高级知识点"的一知半解,以至于知其然,却不知其所以然 ...

  • 干货 | 冷油器基础知识

    一,什么是冷油器?冷油器是电力系统中汽轮机配套使用的透平油冷却设备,冷油器为光管表面式,采用循环水作为介质实现热交换,从而保证轴承入口油温达到规定值,确保机组正常运行. 编辑搜图请点击输入图片描述(最 ...

  • 公共基础知识:你所不知道的人文常识汇总

    人文常识在中国传统文化中浩如烟海,博大精深,如何在浩如烟海的人文中把握准考点所在,是非常困难的,但是在我们历年事业单位考察中均有个别题目与当年的重大时政新闻紧密相关.小编根据2020年以来的时政帮各位 ...

  • 人力资源的7个基础知识?

    什么是人力资源管理? 让我们从一个简短的定义开始,人力资源管理是管理人员以取得更好绩效的一种做法. 例如,如果您雇用某人从事某项业务,则是在寻找适合公司文化的人,因为与那些不适合公司文化的人相比,他们 ...

  • 社区考试公共基础知识:中国四大名关

    社区考试公共基础知识:中国四大名关

  • 社区考试公共基础知识:名医扁鹊

    社区考试公共基础知识:名医扁鹊