能用的东西为什么要改?因为改了之后效果更好。开发者换用其他工具或语言来编程也是这个道理,因为换了之后工作效率更高。如果不肯改变现有的习惯,那么就体会不到新技术的好处,但如果这种新的技术与你熟悉的技术看上去很像,那么改起来就特别困难。例如C#语言就与C++或Java语言相似,由于它们都用一对花括号来表示代码块,因此,开发者即便切换到了C#语言,也总是会把使用那两门语言时所养成的习惯直接带过来,这样做其实并不能发挥出C#的优势。这门语言的首个商用版本发布于2001年,经过这些年的演变,当前这一版C#语言与C++或Java之间的差别已经远远大于那个年代。如果你是从其他语言转入C#的,那么需要学习C#语言自己的编程习惯,使得这门语言能够促进你的工作,而不是阻碍你的工作。本章会提醒大家把那些与C#编程风格不符的做法改掉,并培养正确的编程习惯。
第1条:优先使用隐式类型的局部变量
隐式类型的局部变量是为了支持匿名类型机制而加入C#语言的。之所以要添加这种机制,还有一个原因在于:某些查询操作所获得的结果是IQueryable,而其他一些则返回IEnumerable。如果硬要把前者当成后者来对待,那就无法使用由IQueryProvider所提供的很多增强功能了(参见第42条)。用var来声明变量而不指明其类型,可以令开发者把注意力更多地集中在名称上面,从而更好地了解其含义。例如,jobsQueuedByRegion这个变量名本身就已经把该变量的用途说清楚了,即便将它的类型Dictionary>写出来,也不会给人提供多少帮助。
对于很多局部变量,笔者都喜欢用var来声明,因为这可以令人把注意力放在最为重要的部分,也就是变量的语义上面,而不用分心去考虑其类型。如果代码使用了不合适的类型,那么编译器会提醒你,而不用你提前去操心。变量的类型安全与开发者有没有把变量的类型写出来并不是同一回事。在很多场合,即便你费心去区分IQueryable与IEnumerable之间的差别,开发者也无法由此获得有用的信息。如果你非要把类型明确地告诉编译器,那么有时可能会改变代码的执行方式(参见第42条)。在很多情况下,完全可以使用var来声明隐式类型的局部变量,因为编译器会自动选择合适的类型。但是不能滥用这种方式,因为那样会令代码难于阅读,甚至可能产生微妙的类型转换bug。
局部变量的类型推断机制并不影响C#的静态类型检查。这是为什么呢?首先必须了解局部变量的类型推断不等于动态类型检查。用var来声明的变量不是动态变量,它的类型会根据赋值符号右侧那个值的类型来确定。var的意义在于,你不用把变量的类型告诉编译器,编译器会替你判断。
笔者现在从代码是否易读的角度讲解隐式类型的局部变量所带来的好处和问题。其实在很多情况下,局部变量的类型完全可以从初始化语句中看出来:
懂C#的开发者只要看到这条语句,立刻就能明白foo变量是什么类型。此外&