• 从C# 3.0说以人为本(一)—— 编译器的支持


    “科技,以人为本”,这句话是不是NOKIA自创的小凡不得而知,不过,在这方面做的最好的微软实在是要在里面占上一个很有力的位置。

    且不说微软的操作系统进步有目共睹(当然也有如VISTA一般敢于吃螃蟹却因为华而不实遭到放弃的实例),事实上,在.NET项目中,对于C#语言和一些编程风格上的改进的确让小凡觉得处处都是为人着想。

    说到.NET 3.0,最大的变化当属LINQ和Lambda表达式,我们先从LINQ入手,看看为了实现LINQ的功能,分析微软做了多少工作。

     

    一,MSDN的示例

    1. class IntroToLINQ
    2. {       
    3.     static void Main()
    4.     {
    5.         // The Three Parts of a LINQ Query:
    6.         //  1. Data source.
    7.         int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
    8.         // 2. Query creation.
    9.         // numQuery is an IEnumerable<int>
    10.         var numQuery =
    11.             from num in numbers
    12.             where (num % 2) == 0
    13.             select num;
    14.         // 3. Query execution.
    15.         foreach (int num in numQuery)
    16.         {
    17.             Console.Write("{0,1} ", num);
    18.         }
    19.     }
    20. }

    上面一段代码是从MSDN原封不动抄下来的,熟悉C# 2.0的朋友对实例化一个int类型的数组和foreach自然不会陌生,但是,中间那看似SQL,又是写在C#中,并且是强类型(Strong Typed)的语句显得有点摸不着头脑。

    首先,我们不得不说这样的语句非常方便,一目了然,就是取出数组中是偶数的数字并且单独形成一个IEnumerable<int>类型的序列。事实上,这个语句是可以翻译成最经典的C# 2.0方法的,我们从2.0慢慢一步步进化。如下:

     

    二,最原始的2.0版本

    1. List<int> numQuery = new List<int>();
    2. foreach (int num in numbers)
    3. {
    4.     if (num % 2 == 0)
    5.     {
    6.         numQuery.Add(num);
    7.     }
    8. }

    这个看起来是不是舒服了很多?非常标准的2.0代码哟。然而,3.0中加入了“扩展函数”和Lambda表达式这个概念,所以,这段2.0代码可以变成标准的3.0代码。

     

    三,进化后的3.0版本

    1. IEnumerable<int> numQuery = numbers.Where((number) => number % 2 == 0);

    突然觉得好简单!只要一行代码就完成了上面的工作!

    等等,这个Where函数是哪儿来的?后面不知所云的((number) => number % 2 == 0)形参又是什么?这个我们放到后面再讨论。今天我们只关注编译器的支持。

     

    经过两个版本的演变,我们可以看一下,到底哪个最好?事实上,如果熟悉C# 3.0,应该是最后一个版本最简洁方便。可是如果是刚入门的.NET程序员,看到最后一个版本的代码的时候,会不会扭头就走掉?这个代码有点晦涩,但是又有点方便,一时完全不知道怎么表达对这种语句的敬畏(事实上小凡一开始的确是这样的感受,可能是人笨没办法,呵呵)。

    但是如果看第一个MSDN的示例,我想只要做过一点程序和数据库打过一点交道的人,都会知道这是什么意思。

    事实上,

    from num in numbers,不就是foreach (int num in numbers)吗?

    where (num % 2) == 0,不就是if (num % 2 == 0)或者numbers.Where((number) => number % 2 == 0)吗?

    select num,不就是numQuery.Add(num)吗?

     

    通过编译器的支持,将面向对象的语句就可以变成灵活的LINQ语句,让大家既能减少代码的编写,也能更清楚的描述出代码所要做的意图,这是编译器上为了以人为本所做的工作。

  • 相关阅读:
    JZ067剪绳子
    JZ064滑动窗口的最大值
    JZ061序列化二叉树
    JZ063数据流中的中位数
    JZ066机器人的运动范围
    LeetCode151翻转字符串里的单词
    LeetCode153寻找旋转排序数组中的最小值
    LeetCode162寻找峰值
    JZ062二叉查找树的第 K 个结点
    centos7下rsync+inotify脚本实现文件同步,.NET CORE客户端文件更新后自动重启服务
  • 原文地址:https://www.cnblogs.com/vanpan/p/3583054.html
Copyright © 2020-2023  润新知