return(Type)实例或返回实例作为Type

时间:2011-07-18 12:42:34

标签: c# casting

(虚构)之间有什么区别:

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

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

如果obj == null,第一种方法是否会引发异常?第二个不是吗?

3 个答案:

答案 0 :(得分:8)

没有;如果nullobj,则两种方法都会成功并返回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运算符无法执行其他转换,   例如用户定义的转换,应由其执行   使用强制转换表达式。