zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善C#程序的157个建议——建议37:使用Lambda表达式代替方法和匿名方法

    建议37:使用Lambda表达式代替方法和匿名方法

    在建议36中,我们创建了这样一个实例程序:

            static void Main(string[] args)
            {
                Func<int, int, int> add = Add;
                Action<string> print = Print;
                print(add(1, 2).ToString());
            }
    
            static int Add(int i, int j)
            {
                return i + j;
            }
    
            static void Print(string msg)
            {
                Console.WriteLine(msg);
            }

    实际上要完成相同的功能,还有很多种编码方式。先看一种最中规中矩的,也是最繁琐的写法:

            static void Main(string[] args)
            {
                Func<int, int, int> add = new Func<int, int, int>(Add);
                Action<string> print = new Action<string>(Print);
                print(add(1, 2).ToString());
            }
    
            static int Add(int i, int j)
            {
                return i + j;
            }
    
            static void Print(string msg)
            {
                Console.WriteLine(msg);
            }

    注意:上面的语法虽然繁琐,但是我们可以从中加深对委托本质的认识:委托也是一种数据类型,跟任何FCL 中的引用类型没有差别。

    也可以使用匿名方法:

                Func<int,int,int> add=new Func<int, int, int>(delegate(int i, int j)
                {
                    return i + j;
                });
    
                Action<string> print=new Action<string>(delegate(string msg)
                {
                    Console.WriteLine(msg);
                });

           print(add(1, 2).ToString());

    使用匿名方法后,我们就不需要再Main方法外部声明两个方法了,可以直接在Main这个工作方法中完成所有代码编写,而不会影响代码清晰性。实际上,所有代码行数不超过3行的方法(条件是它不被重用),我们都建议采用这种方式来编写。

    上面的改进版本为:

                Func<int,int,int> add=delegate(int i, int j)
                {
                    return i + j;
                };
    
                Action<string> print=delegate(string msg)
                {
                    Console.WriteLine(msg);
                };

           print(add(1, 2).ToString());

    最终改进版本是使用Lambda表达式:

                Func<int,int,int> add= (i, j) => i + j;
                Action<string> print= msg => Console.WriteLine(msg);
                print(add(1, 2).ToString());

    Lambda表达式操作符“=>”的左侧是方法的参数,右侧是方法体,其本质是匿名方法。实际上,经过编译后的Lambda表达式就是一个匿名方法。我们应该在实际编码中熟练运用它,避免出现繁琐且不美观的代码。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    区别@ControllerAdvice 和@RestControllerAdvice
    Cannot determine embedded database driver class for database type NONE
    使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
    Markdown语法笔记
    Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    Mysql 查看连接数,状态 最大并发数(赞)
    OncePerRequestFilter的作用
    java连接MySql数据库 zeroDateTimeBehavior
    Intellij IDEA 安装lombok及使用详解
    ps -ef |grep xxx 输出的具体含义
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7943722.html
Copyright © 2011-2022 走看看