(虚构)之间有什么区别:
public Test GetTest()
{
Object obj = new Test();
return (Test)obj;
}
和
public Test GetTest()
{
Object obj = new Test();
return obj as Test;
}
如果obj == null,第一种方法是否会引发异常?第二个不是吗?
答案 0 :(得分:8)
没有;如果null
为obj
,则两种方法都会成功并返回null
。不同之处在于如果obj
不是Test
的实例会发生什么:第一种方法会抛出异常,而第二种方法会成功并返回null
。
换句话说:如果您知道对象是Test
或者您不知道它是什么,请使用第一种方法,但如果它不是Test
则需要例外。如果您不知道对象是什么,请使用第二种方法,但如果它不是null
,您只需要和平Test
。如果类型检查成功,您还可以使用as
进行类型检查:
var t = obj as Test;
if (t != null) {
...
}
而不是:
if (obj is Test) {
var t = (Test)obj;
...
}
这样,您不需要重复类型名称,尽管第二种形式可能更清晰,并且避免将t
泄露给范围的其余部分。
另外,请参阅@ il_guru的帖子,了解与as
相关的其他警告。
答案 1 :(得分:2)
两者都不会在施法线上抛出异常。在C#中,如果new
返回(因为构造函数没有抛出异常),那么obj
(几乎是,你的内存以某种方式被破坏的模数情况)保证是{的良好记忆{1}} ed类型。这意味着,new
永远不会被分配obj
。
考虑到这一点,我更喜欢C风格的演员表(即null
),因为它肯定会起作用,并且读起来更清晰。
一般情况下,强制转换之间的区别在于,如果您输入的类型错误,C样式将抛出异常,而(Test)obj
只返回as
。但同样,这些都不会发生在您提供的代码中。
答案 2 :(得分:2)
除了前一个答案中关于NULL的说法(显式转换为null不会引发异常), as 强制转换有一些限制;正如MSDN
所述请注意,as运算符仅执行引用转换和 拳击转换。 as运算符无法执行其他转换, 例如用户定义的转换,应由其执行 使用强制转换表达式。