假设有一个接口A
和一个实现该接口的类的变量“x”。现在我可以执行这些:
var a = (A) x;
或者:
var a = x as A;
我知道在失败的情况下,第一条语句会抛出 an InvalidCastException
,第二条语句会 return null
。但是还有其他区别吗?特别是性能?
通过这样做(A)x
,你正在做一个肯定会尝试和施放的演员,如果它不能施放,就会有一个例外。
如果您使用as
它将强制转换或成为null
.
但是,您拥有自己尝试此操作所需的所有示例代码,因此您可以在询问我们您所说的代码将要做什么之前尝试此操作。
第一个尝试立即转换,第二个实际上检查 x 是否属于 A 类型。
as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。
您可以使用 as 运算符在兼容的引用类型或可空类型之间执行某些类型的转换。
考虑以下示例:
expression as type
该代码等价于以下表达式,只是表达式变量仅计算一次。
expression is type ? (type)expression : (type)null
请注意,as 运算符仅执行引用转换、可为空的转换和装箱转换。as 运算符不能执行其他转换,例如用户定义的转换,而应使用强制转换表达式来执行。
参考: as(C#参考)