前言:
《Effective C#》是Effective系列又一力作,旨在介绍C#语言的代码技巧。为什么要学?C#语法和C++、Jave相似,初学者会代入其他语言的代码习惯,但C#自身的特性决定它拥有特殊的技巧。就像书中的前言:“为什么要改变代码习惯?因为改后更好用”。
这个系列会有详有略地介绍书中让我印象深刻的内容,希望能帮到和我一样在C#的学习道路上的新手与老手。本文是第一部分,涵盖书中1、2条。
目录
1. 优先使用隐式类型的局部变量
作者举了很多例子,但归根结底就是一句话:编译器比程序员想象的聪明,会自动选择最合适的变量类型,只需要给变量取一个好名字,让人一读到就知道这个变量的含义。有2种好处:
(1)代码更简洁。
一般情况下,赋值号右侧表达式可以确定类型,如var cnt = 3; 或var time = DateTime.Now。这里的cnt会被自动判定为int类型,time则是DateTime类型。用var替代int和DateTime,代码更加清晰简洁,发挥出了静态类型的优势。
注意,用隐式类型的局部变量并不是动态类型!隐式类型会在编译期确定,报错也会在运行期之前。
(2)效率更高
先举例:C#的Linq模块有两种接口,IEnumerable和IQueryable,两种接口的查询机制不一样。如果你比较菜,不是很懂两者的区别,或者脑子一热用错了,你就可能喜提超长运行时。但如果用隐式类型,编译器是不会犯这种错误的。
所以,为了新人友好地提升代码效率,推荐隐式类型。
但隐式类型也有两个不足:
(1)不能作为全局变量,只能是局部变量
也就是说,var只能用在方法内部。类内部方法外部、类外部,还是老老实实写出完整的数据类型吧。
(2)其他情况
有些变量类型需要明确声明的,不能用隐式类型
2. 运行期常量与编译器常量
C#有两种常量,运行期常量用readonly修饰,编译期常量用const修饰。
区别
(1)编译期常量会直接嵌入代码,而运行期常量则是引用这个readonly量
(2)编译器常量只能表示值类型,如int\float\char\string\enum,且只能用数字、字符串、null给const常量赋值。运行期常量类型不受限制。
(3)const类型的变量修改后,需要重新编译才能生效,而readonly类型的变量不需要重新编译。修改const常量相当于修改接口,修改readonly常量相当于修改实现细节。
修改不等于重新赋值
哪怕一个实例被声明为readonly,我们依旧可以可以在外部(非声明和构造函数)对readonly的变量进行修改内容操作。只要不重新赋值就行。
应用
(1)把某个值在编译器固定下来,用编译器常量。如:版本号
(2)性能要求高,用编译期常量
(3)除此之外用更灵活的readonly