zoukankan      html  css  js  c++  java
  • 从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语句,让大家既能减少代码的编写,也能更清楚的描述出代码所要做的意图,这是编译器上为了以人为本所做的工作。

  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/vanpan/p/3583054.html
Copyright © 2011-2022 走看看