2011-07-18 138 views
2

什么(虚构的)之间的区别:回报(类型)实例或返回实例作为类型

public Test GetTest() 
{ 
    Object obj = new Test(); 
    return (Test)obj; 
} 

而且

public Test GetTest() 
{ 
    Object obj = new Test(); 
    return obj as Test; 
} 

是不是正确的,第一种方法抛出如果obj ==异常空值?而第二个不?

回答

8

否;如果objnull,则两种方法都会成功并返回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相关的一些其他注意事项。

+0

清除出口。感谢名单! –

2

也不会在投线上抛出异常。在C#中,如果new返回(因为构造函数没有抛出异常),那么obj(很可能是模数情况下,你的内存被破坏了)保证是new ed类型的良好内存。这意味着,除其他事项外,obj将永远不会被分配到null。因此,我更喜欢C风格演员(即(Test)obj),因为它肯定有效,而且阅读起来更清晰一些。

一般来说,演员阵容之间的区别在于,如果您的类型错误,C风格将抛出异常,而as只返回null。但是,再次,这些都不会发生在您提供的代码中。

2

除了前面的回答中有关NULL的内容(显式转换为null不会引发异常)之外,作为转换也有一些限制;如上所述MSDN

请注意,as运算符仅执行参考转换和 装箱转换。 as运算符不能执行其他转换,例如用户定义的转换等 ,应该使用转换表达式执行 。

相关问题