Effective|Effective C#笔记 - 优先考虑is或as运算符,尽量少用强制类型转换
C#的静态类型检查机制,可以在编译期就筛选出错误的类型使用,可以帮助构建更安全的代码和程序。但同时,也还是有要在运行期检查对象类型的机制,比如方法中的参数类型是object。这样,我们就需要根据运行时需求转换成所需要的类型。转换的方式有两种,用as转换,或者强制转换。
优先推荐as运算符来转换的理由:
1. 使用as运算符实现类型转换要比盲目强制类型转换要更加安全,也更有效率;
2. as或is运算符不会考虑用户自定义转换操作,只有当运行期的类型与要转换到的类型相符时,转换操作才能成功完成;
3. as或is运算符的转换操作很少会为了类型转换而构建新对象(但若用as运算符把装箱的值类型转换成未装箱且可以为null的值类型,则会创建新的对象);
4. as运算符在转换操作中,如果操作失败时,会返回null,而强制转换则需要考虑转换失败所抛出的异常,额外增加了消耗。
使用区别:
public class Factory
{
public static object GetObject()
{
return new MyType();
}
}public class MyType {}public void TestMethodUseAs()
{
object obj = Factory.GetObject();
MyType t = obj as MyType;
if(null != t)
{
// do right thing
}
}public void TestMethodUseCast()
{
object obj = Factory.GetObject();
try{
MyType t;
t = (MyType)obj;
if(null != t)
{
// do right thing
}
}
catch(InvalidCastException e)
{
// log error
}
}
很显然,直接使用as运算符既方便,也安全。强制转换不仅要处理本身为null的情况,还要处理转换失败的异常情况。而两者最大的区别在于如何对待用户定义的转换逻辑。as和is运算符只会判断待转换的对象在运行期是何种类型,并且处理必要的装箱和拆箱操作外,不会执行其它操作。强制类型会考虑用户自定义转换逻辑,但是针对的是源对象的编译期类型,上例中的object类型,而不是运行期的类型。
【Effective|Effective C#笔记 - 优先考虑is或as运算符,尽量少用强制类型转换】但是也并非所有情况都如此,需要用强制转换的情况也还是有,比如转为int等值类型。
程序编写中应该尽量避免类型转换操作,但是总有场合必须要使用,此时应该用as或is来清晰表达代码意图。
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- Android中的AES加密-下
- 【读书笔记】贝叶斯原理
- 【韩语学习】(韩语随堂笔记整理)
- 人性的弱点-笔记
- 读书笔记:博登海默法理学|读书笔记:博登海默法理学 —— 正义的探索(1)
- D034+3组苏曼+《写作这回事》读书笔记
- 《自我的追寻》读书笔记3
- 最有效的时间管理工具(赢效率手册和总结笔记)
- 机器学习|机器学习 Andrew Ng《Machine Learning》课程笔记1