匿名函数 (anonymous function) 是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或类型,但可以转换为兼容委托或表达式树类型。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托值。如果目标类型为表达式目录树类型,则转换将计算以对象结构形式表示方法结构的表达式目录树。

    lambda-expression形式的匿名函数的参数可以显式或隐式类型化。在显式类型化参数列表中,每个参数的类型是显式声明的。在隐式类型化参数列表中,参数的类型是从匿名函数出现的上下文中推断的,具体而言,当匿名函数转换为兼容委托类型或表达式目录树类型时,该类型提供参数类型(第‎6.5节)。
    在具有一个隐式类型化参数的匿名函数中,参数列表中可以省略括号。换言之,具有以下形式的匿名函数
    ( param ) => expr
    可以简写为
    param => expr
    anonymous-method-expression形式的匿名函数的参数列表是可选的。如果提供了参数,则参数必须显式类型化。如果未给出参数,则匿名函数可以转换为带有不含out参数的参数列表的委托。
    除非匿名函数出现在不可到达的语句内,否则该匿名函数的block是可到达的(第‎8.1节)。
    下面是一些匿名函数示例:
    x => x + 1 // Implicitly typed, expression body
    x => { return x + 1; } // Implicitly typed, statement body
    (int x) => x + 1 // Explicitly typed, expression body
    (int x) => { return x + 1; } // Explicitly typed, statement body
    (x, y) => x * y // Multiple parameters
    () => Console.WriteLine() // No parameters
    async (t1,t2) => await t1 + await t2 // Async
    delegate (int x) { return x + 1; } // Anonymous method expression
    delegate { return 1 + 1; } // Parameter list omitted
    lambda-expression和anonymous-method-expression的行为除以下几点外是相同的:
    · anonymous-method-expression允许完全省略参数列表,从而可转换为具有任意值参数列表的委托类型。
    · lambda-expression允许省略和推断参数类型,而anonymous-method-expression要求显式声明参数类型。
    · lambda-expression的主体可以为表达式或语句块,而anonymous-method-expression的主体必须为语句块。

    匿名方法和lambda表达式:

    1. using System;
    2. using System.Collections.Generic;
    3. namespace _146_匿名方法和lambda表达式
    4. {
    5. class Program
    6. {
    7. public delegate void DelOne();
    8. public delegate void DelTwo(string name);
    9. public delegate string DelThree(string name);
    10. static void Main(string[] args)
    11. {
    12. DelOne del1 = delegate () { };
    13. del1 = () => { };
    14. DelTwo del2 = delegate (string name) { };
    15. del2 = (string name) => { };
    16. DelThree del3 = delegate (string name) { return name; };
    17. del3 = (string name) => { return name; };
    18. //使用lambda表达式来删除指定元素
    19. List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
    20. list.RemoveAll(n => n > 4);//
    21. foreach (var item in list)
    22. {
    23. Console.WriteLine(item);
    24. }
    25. Console.ReadKey();
    26. }
    27. }
    28. }