假设有一个接口A
和一个实现该接口的类的变量'x'。现在,我可以执行这些:演员之间有什么区别:(A)x和x为A?
var a = (A) x;
或者:
var a = x as A;
我知道,在发生故障的情况下,第一条语句将抛出InvalidCastException
和第二次返回null
。但是还有其他的区别吗?特别是在表现?
假设有一个接口A
和一个实现该接口的类的变量'x'。现在,我可以执行这些:演员之间有什么区别:(A)x和x为A?
var a = (A) x;
或者:
var a = x as A;
我知道,在发生故障的情况下,第一条语句将抛出InvalidCastException
和第二次返回null
。但是还有其他的区别吗?特别是在表现?
的作为操作者是一样的铸造操作。但是,如果转换不可行,则返回null而不是引发异常。
您可以使用as运算符在兼容的引用类型或可为空的类型之间执行某些类型的转换。
考虑下面的例子:
expression as type
该代码相当于除了表达变量只计算一次以下表达式。
expression is type ? (type)expression : (type)null
注意将作为运营商只执行基准转换,可空转换和装箱转换。 as运算符不能执行其他转换,例如用户定义的转换,而应该使用转换表达式来执行转换。
通过做(A)x
你正在做一个明确的尝试和施放的演员,如果它不能施展,将会有一个例外。
如果您使用as
它将投射或者是null
。
但是,您有自己需要的所有示例代码,因此您可以在询问我们已经声明的代码将要执行的操作之前尝试执行此操作。
第一个尝试立即进行转换,所述第二个实际检查x是否是类型A.
http://stackoverflow.com/a/702243/284240 – 2013-02-20 14:21:21
已经在这里问:http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator – Pete 2013-02-20 14:21:30
您是否尝试过对此进行基准测试? – 2013-02-20 14:21:44