C#程序员最易犯的编程错误

2019-12-26 13:38:31王振洲

  一些C#的程序员甚至都不知道LINQ的存在,好在不知道的人正在逐步减少。但是还有些人误以为LINQ只用在数据库查询中,因为LINQ的关键字和SQL语句实在是太像了。

  虽然数据库的查询操作是LINQ的一个非常典型的应用,但是它同样可以应用于各种可枚举的集合对象。(如:任何实现了IEnumerable接口的对象)。举例来说,如果你有一个Account类型的数组,不要写成下面这样:
 

  1. decimal total = 0; foreach (Account account in myAccounts) { if (account.Status == "active") {   total += account.Balance; 
  2. }  } 
?

你只要这样写:
 

  1. decimal total = (from account in myAccounts      where account.Status == "active" 
  2.     select account.Balance).Sum(); 
?

  虽然这是一个很简单的例子,在有些情况下,一个单一的LINQ语句可以轻易地替换掉你代码中一个迭代循环(或嵌套循环)里的几十条语句。更少的代码通常意味着产生Bug的机会也会更少地被引入。然而,记住,在性能方面可能要权衡一下。在性能很关键的场景,尤其是你的迭代代码能够对你的集合进行假设时,LINQ做不到,所以一定要在这两种方法之间比较一下性能。

  常见错误:在LINQ语句之中没有考虑底层对象

  对于处理抽象操纵集合任务,LINQ无疑是庞大的。无论他们是在内存的对象,数据库表,或者XML文档。在如此一个完美世界之中,你不需要知道底层对象。然而在这儿的错误是假设我们生活在一个完美世界之中。事实上,相同的LINQ语句能返回不同的结果,当在精确的相同数据上执行时,如果该数据碰巧在一个不同的格式之中。

  例如,请考虑下面的语句:
 

  1. decimal total=(from accout in myaccouts  where accout.status==‘active" 
  2.      select accout .Balance).sum(); 
?

  想象一下,该对象之一的账号会发生什么。状态等于“有效的”(注意大写A)?