建议六:区别 readonly 和 const 的区别
建议七:将 0 作为枚举的默认值
建议八:避免给枚举类型的元素提供显式的值
建议九:习惯重载运算符
建议十:创建对象时需要考虑是否实现比较器
建议六:区别 readonly 和 const 的区别
const
const 是一个编译期常亮,用使用 const 的理由只有一个,那就是效率。const只能修饰基元类型、枚举类型或字符串类型。经过编译器编译后,我们在代码中引用 const 变量的地方会用 const 变量 所对应的实际值来代替,如,以下两句 WriteLine 语句的 IL 代码是一致的:
1 | const int ConstValue = 100; |
readonly
readonly 是运行时常量,修饰类型没有限制。readonly 常量的复制行为发生在运行时,它在运行时第一次被赋值后将不可改变。
- 对于值类型,之本身不可改变。
- 对于引用类型,引用本身(指针)不可改变。
建议七:将 0 作为枚举的默认值
这里的主要原因是出于0作为默认值时所具有的工程上的意义。
原因参见以下代码:
1 | enum Week |
输出值会是超出枚举定义范围的 0。
建议八:避免给枚举类型的元素提供显式的值
一般情况下,没有必要给枚举类型的元素提供显式的值。创建枚举的理由之一,就是为了代替使用实际的数值。不正确的为枚举类型设定显式的值,会带来意想不到的错误。
1 | enum Week |
枚举中,未显式指定的值会自动等于上一个值 +1,所以在这个枚举类型 Week 中,TempValue 和 Wednesday 的值均为 3 ,这会在实际业务中带来毁灭性的问题。
1 | Week week= Week.TempValue; |
输出:
1 | Wednesday |
建议九:习惯重载运算符
如果业务意义上的加减乘除复制等运算,应该习惯于重载运算符,而不是使用普通方法。
建议十:创建对象时需要考虑是否实现比较器
有对象的地方就会存在比较,在 .NET 的世界中也一样。创建类型时需要根据业务上的可能性,考虑为类型实现 ICompareable 接口。