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个建议》陆敏技

  • 相关阅读:
    Linux oracle操作
    Job
    Oracle创建表空间和用户并分配权限
    Oracle赋予用户查询另一个用户所有表的权限
    plsql中文乱码解决方案
    PLSQL创建Oracle定时任务,定时执行存储过程
    fcntl函数参数F_GETPIPE_SZ、F_SETPIPE_SZ报错引出的关于linux-specific头文件的使用方法
    从Windows Server 2008 迁移mantis到CentOS 6.8
    从Windows Server 2008 迁移VisualSVN到CentOS 6.8
    CentOS 6.8上开启NFS服务给不同用户使用的曲线设置方法
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4732792.html
Copyright © 2011-2022 走看看