Java教程

lambad表达式和闭包------知识点3

本文主要是介绍lambad表达式和闭包------知识点3,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

lambad表达式

1.定义

1.可以将lambad表达式 理解为匿名函数的简写
它除了写法不同外
使用上和匿名函数一模一样
都是和委托或者事件 配合使用的

using System;

namespace Lesson15_lambad表达式
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("lambad表达式");

            #region 知识点一 什么是lambad表达式
            //可以将lambad表达式 理解为匿名函数的简写
            //它除了写法不同外
            //使用上和匿名函数一模一样
            //都是和委托或者事件 配合使用的
            #endregion

            #region 知识点二 lambad表达式语法
            //匿名函数
            //delegate (参数列表)
            //{

            //};

            //lambad表达式
            //(参数列表) =>
            //{
            //    //函数体
            //};
            #endregion

            #region 知识点三 使用
            //1.无参无返回
            Action a = () =>
            {
                Console.WriteLine("无参无返回值的lambad表达式");
            };
            a();
            //2.有参
            Action<int> a2 = (int value) =>
            {
                Console.WriteLine("有参数Lambad表达式{0}", value);
            };
            a2(100);

            //3.甚至参数类型都可以省略 参数类型和委托或事件容器一致
            Action<int> a3 = (value) =>
            {
                Console.WriteLine("省略参数类型的写法{0}", value);
            };
            a3(200);
            //4.有返回值
            Func<string, int> a4 = (value) =>
            {
                Console.WriteLine("有返回值有参数的那么大表达式{0}", value);
                return 1;
            };
            Console.WriteLine(a4("123123"));

            //其它传参使用等和匿名函数一样
            //缺点也是和匿名函数一样的
            #endregion

            Test t = new Test();

            t.DoSomthing();
        }
    }

}

闭包

定义

1、内层的函数可以引用包含在它外层的函数的变量
2、即使外层函数的执行已经终止
3、注意:
== 该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值。==
这个很重要

    #region 知识点四 闭包
  

    class Test
    {
        public event Action action;

        public Test()
        {
            int value = 10;
            //这里就形成了闭包
            //因为 当构造函数执行完毕时  其中申明的临时变量value的声明周期被改变了
            //本来value是在方法内,在栈上,随着方法被移除,但是这里把它放入了委托内,改变了它的生命周期,只有清空委托的时候才会将这个value释放掉
            action = () =>
            {
                Console.WriteLine(value);
            };

            for (int i = 0; i < 10; i++)
            {
                //此index 非彼index
                int index = i;
                //注意如果没有上面的    int index = i;那么在打印事件的时候,打印的都是10,为什么呢,存储变量提供的值并非变量创建时的值,而是在父函数范围内的最终值。i 的最终值是 10,所以存放了10个10,怎么解决,上面那个做法就可以,用    int index = i;这样index就是每次都会开辟新的栈空间,并不是同一个index,像上面那个i来回++,那个才是同一个空间。
                action += () =>
                {
                    Console.WriteLine(index);
                };
            }
        }

        public void DoSomthing()
        {
            action();
        }
    }

    #endregion
    
    //总结
    //匿名函数的特殊写法 就是 lambad表达式
    //固定写法 就是 (参数列表)=>{}
    //参数列表 可以直接省略参数类型
    //主要在 委托传递和存储时  为了方便可以直接使用匿名函数或者lambad表达式

    //缺点:无法指定移除

在这里插入图片描述
在这里插入图片描述

这篇关于lambad表达式和闭包------知识点3的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!