• 匿名方法和Lambda 表达式


    Overview

    当你使用委托的时候,有时候是否会感觉到略微有些麻烦,尽管委托已经极大的减少了我们的工作量,比如,有一个方法,只需要使用一次,仅仅是传递给委托,我们就要定义一次他,这未免太 “重量级了”。C# 总是很人性化的当然有办法减轻我们的不必要的编码负担了,他们就是:

    • 匿名方法 C# 2.0 时 引入的
    • Lambda 表达式 C# 3.0 时 引入的

    匿名方法

    为了减少使用委托时产生额冗余代码,在C# 2.0 的时候,引入了一种非常精简的方法,来创建委托。 他就是匿名方法

    定义简单的委托

    namespace UnderstandDelegate
    {
        public delegate void SimpleHandler();
    }
    
    

    创建一个Person类使用委托

    namespace UnderstandDelegate
    {
        public class Person
        {
            public void SimpleMethod(SimpleHandler handler)
            {
                if (handler != null)
                    handler.Invoke();
            }
        }
    }
    

    原来的实例化方式

    namespace UnderstandDelegate
    {
        class Program
        {
            static void Main(string[] args)
            {
                Person person = new Person();
                person.SimpleMethod(Simple);
            }
    
            public static void Simple()
            {
                Console.WriteLine("Simple");
            }
    
        }
    }
    
    

    这我,我们最开始接触委托的时候,使用的方式,我们需要生命一个方法,将其赋值给委托,有时候该方法仅仅就使用一次,但是我们还是要声明他,太冗余了,并且,方法的名字有时候还是一个非常头痛的事情。

    匿名方法的实例化方式

    无参数无返回值的形式

    person.SimpleMethod(delegate ()
    {
        Console.WriteLine("匿名方法!");
    });
    

    有参数无返回值的形式

    //委托
    public delegate void Simple2Handler(string value);
    
    //调用
    Simple2Handler handler = delegate (string value)
    {
        Console.WriteLine(value);
    };
    
    handler.Invoke("Hello");
    

    有参数有返回值的形式

    
    public delegate string Simple3Handler(string value);
    
    Simple3Handler handler = delegate (string value)
    requirement 
        return "";
    };
    handler.Invoke("Hello");
    

    有没有感觉到瞬间清爽了很多,我们省略了不必要的方法定义,以为这个方法只使用一次,所以方法名也被省略掉了。哦,不要满足,我们稍后我们还有更简洁的方式。

    Lambda 表达式

    在 C# 3.0 的时候,引入了更加简洁的方式Lambda 表达式,他将简洁做到了极致。下面我们来看一下更为简洁的方式是什么样的:

    Lambda 表达式的语法

    (参数....) => {
      业务逻辑
      return 返回值;
    };
    

    这是完整的语法,我们在来看一下,他的更简洁的形式

    没有参数没有返回值,只有一行代码的时候

    () => 代码;
    

    一个参数,一行代码的形式

    x => 代码;
    

    一个参数,一个返回值的形式 , 假设返回值是string类型 , 我们连return 关键字都省略了。

    x => "HelloWorld!";
    

    多个参数, 多行代码 一个返回值的形式

    (x,y) =>
    {
        //代码1
      	//代码2
    	return 返回值;
    };
    

    最终的简化代码

    //没有参数没有返回值
    SimpleHandler h1 = () => Console.WriteLine("HelloWorld");
    //一个参数没有返回值
    Simple2Handler h2 = x => Console.WriteLine("HelloWorld");
    //一个参数一个返回值
    Simple3Handler h3 = x => "HelloWorld";
    
    

    虽然我们的代码量变的很少,但是最后的代码还是一点都没有变少,最后的编译结果会变成类似下面的这样,只是编译器帮我们将多余的工作都完成了。

    结语

    本文,所讲的 Lambda表达式,将会在 ORM框架中被广泛的时候,关于ORM框架知识,这了就不在赘述,如果大家有兴趣,可以自己去了解,比如说 Linq 框架和 EF 框架。

  • 相关阅读:
    09 shell脚本程序练习
    springboot整合vue03-创建springboot工程
    springboot整合vue02-创建前端页面
    springboot整合vue01-创建vue工程
    pe工具04-获取数据目录
    pe工具03-获取节表信息
    pe工具02-解析pe头信息
    pe工具01-获取进程和模块
    以挂起方式创建进程
    进程
  • 原文地址:https://www.cnblogs.com/slyfox/p/7522738.html
Copyright © 2020-2023  润新知