C#编程中的类型安全、不可变性与值类型规范
始终优先选择类型安全
C# 是一种强类型语言,强类型语言与其编译器能够在错误发生前将其检测出来。尽管托管世界中的每个对象都继承自System.Object,但通过System.Object引用来泛型处理每个对象并非明智之举,主要有两方面原因。
一方面是效率问题。例如,若通过System.Object引用维护一个Employee对象集合,在调用Evaluate方法前,需将对象实例强制转换为Employee类型。对于引用类型,若转换成功,效率损失较小;但对于值类型,由于 IL 代码中会生成不必要的装箱操作,效率损失会被放大。此外,使用引用类型时,强制转换失败会抛出异常,而使用强类型可在编译时捕获此类问题。
另一方面与错误捕获有关。以实现ICloneable接口为例,Clone方法返回Object类型实例,虽使接口能泛型适用于所有类型,但也有代价。
C# 和 C++ 都是强类型语言,编译器提供类型安全以避免错误,如防止将MonkeyWrench类的实例赋值给Apple类的实例。不过,C# 允许以类型安全性较低的方式工作,可通过Object类型引用所有对象,但这样会丧失类型安全,可能导致运行时错误。所以,充分利用编译器的类型