回报(类型)实例或返回实例作为类型
什么(虚构的)之间的区别:回报(类型)实例或返回实例作为类型
public Test GetTest()
{
Object obj = new Test();
return (Test)obj;
}
而且
public Test GetTest()
{
Object obj = new Test();
return obj as Test;
}
是不是正确的,第一种方法抛出如果obj ==异常空值?而第二个不?
否;如果obj
为null
,则两种方法都会成功并返回null
。区别在于如果obj
不是Test
的实例会发生什么情况:第一种方法会抛出异常,而第二种方法会成功并返回null
。
换句话说:如果您知道您的对象是Test
或者您不知道它是什么,但是您想要一个例外(如果它不是Test
),请使用第一种方法。如果您不知道自己的物体是什么,请使用第二种方法,但如果它不是Test
,您只想要一个和平的null
。您还可以使用as
进行类型检查,如果你打算做一些特别的东西,如果类型检查成功:的
var t = obj as Test;
if (t != null) {
...
}
代替:
if (obj is Test) {
var t = (Test)obj;
...
}
这样一来,你就不需要重复尽管第二种形式可能更清楚,并避免将t
泄漏到范围的其余部分。
此外,请参阅@ il_guru的帖子,了解与as
相关的一些其他注意事项。
也不会在投线上抛出异常。在C#中,如果new
返回(因为构造函数没有抛出异常),那么obj
(很可能是模数情况下,你的内存被破坏了)保证是new
ed类型的良好内存。这意味着,除其他事项外,obj
将永远不会被分配到null
。因此,我更喜欢C风格演员(即(Test)obj
),因为它肯定有效,而且阅读起来更清晰一些。
一般来说,演员阵容之间的区别在于,如果您的类型错误,C风格将抛出异常,而as
只返回null
。但是,再次,这些都不会发生在您提供的代码中。
除了前面的回答中有关NULL的内容(显式转换为null不会引发异常)之外,作为转换也有一些限制;如上所述MSDN
请注意,as运算符仅执行参考转换和 装箱转换。 as运算符不能执行其他转换,例如用户定义的转换等 ,应该使用转换表达式执行 。
清除出口。感谢名单! –