C#是强类型语言,在开发过程中类型之间的相互转化是一种很常见的场景。C#为类型转换提供两种选择:
- 1.使用as操作符
- 2.使用强制类型转换
或者可以使用更保险的做法,首先用测试一下,能否转换成功,然后再使用或者强制类型转换。在大部分情况下,我们应该尽可能的使用as操作符:
因为相对于强制类型转换来说,as更安全,也更加高效。as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象。
使用as或is的优势
- 如果无法进行转换,则 null 而非引发异常,只需要检查返回的引用是否为null即可,避免了异常处理带来的开销。
- 使用as操作符转换对象为null时返回null,如果使用强制转换的方式null可以被转换成任意的引用类型。
as操作符的限制
- as操作符不能配合值类型使用,因为它们永远都不可能为null。
is操作符的使用
- 在不确定的强制类型转换中使用异常来控制程序流是一个很糟糕的做法,在转换之前我们可以使用is来避免冒出异常或转换。
- 当不能使用as进行转换时,才应该使用is操作符。否则is是多余的;因为使用as操作符只需要检查是否为null即可,这样更加简单。
小结:
好的面向对象实践一般都告诉我们要避免转型,但有时侯你却别无选择。在无法避免转型时,我们应该尽可能的使用as和is操作符来更清晰的表达意图。不同的转型方式有不同的规则,is和as操作符在绝大多数情况下都能表达出正确的语义,只有当被测试的对象时正确的类型时才会成功。应尽量选择is和as而不是强制类型转换,因为强制类型转换可能会带来意想不到的负面效应,而且成功或失败往往在我们的预料之外。
阅读书目:
扩展阅读: