C#中的的Lambda表达式本质上与匿名函数的使用别无二差,只是声明方式上不再使用delegate关键字。

using System;
using System.Collections.Generic;
namespace lesson14
{
    class Test 
    {
        public event Action action;

        public Test() 
        {
            int value = 10;
            //内部函数引用了外层函数的变量,从而改变了构造函数的生命周期,形成了一个闭包
            //内层函数可以引用外层函数的变量,即使外层函数的声明周期已经终止
            action = () =>
            {
                Console.WriteLine(value);
            };
            //i的改变并不会与匿名函数同步,而是仅表现i的最终值
            //故而,此处对于i的打印相当于在循环全部结束后为10的时候进行的
            //即内层函数对于外层变量的引用,使用的时在外层函数范围内该变量的最终值
            for (int i = 0; i < 10; i++) 
            {
                action += () =>
                {
                    Console.WriteLine(i);
                };
            }
        }
        public void DoSomthing() 
        {
            action();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //无参无返回值的Lambda表达式
            Action a = () =>
            {
                Console.WriteLine("无参无返回值的Lambda表达式");
            };
            a();
            //有参数的Lambda表达式
            Action<int> a1 = (int value) => 
            {
                Console.Write(value);
            };
            a1(3);
            //参数类型可以省略
            Action<int> a2 = (value) =>
            {
                Console.WriteLine(value);    
            };
            a2(200);
            //有返回值的Lambda表达式
            Func<string, int> a4 = (value) => 
            {
                Console.WriteLine(value);
                return 1;
            };
            Console.WriteLine(a4("123123"));

            Test t = new Test();
            t.DoSomthing();
        }
    }
}

更多推荐