委托和 lambda Delegates and lambdas

    • 行创建特定签名的委托类型,在本例中即接受字符串参数并返回字符串参数的方法。
    • Reverse rev = ReverseString; 行显示可将方法分配给相应委托类型的变量。
    • Console.WriteLine(rev("a string")); 行演示如何使用委托类型的变量来调用委托。 为简化开发过程,.NET 包含一组委托类型,程序员可重用这些类型而无需创建新类型。其中包括 Func<>、 和 Predicate<>,可用于 .NET API 的各个位置,无需定义新委托类型。当然,从这三者的签名可以看出它们之间存在某些差异,主要影响其既定用途:

    • Action<> 用于需要使用委托参数执行操作的情况。

    • Predicate<> 用于需要确定参数是否满足委托条件的情况。也可将其写作 。 现在可使用 Func<> 委托而非自定义类型重新编写上述示例。程序将照旧继续运行。

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

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

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

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

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

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

    此上下文中的 += 运算符用于订阅。有关更多信息,请参见如何:订阅和取消订阅事件