转换:(NewType)与Object作为NewType

Mic*_*tum 85 .net c#

可能重复:
使用CLR中的'as'关键字进行转换

这两个演员之间究竟有什么区别?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Run Code Online (Sandbox Code Playgroud)

通常,它们都应该显式转换为指定的类型?

Ryt*_*mis 86

如果源类型无法转换为目标类型,前者将抛出异常.后者将导致sc2为空引用,但没有例外.

[编辑]

我最初的答案肯定是最显着的差异,但正如Eric Lippert 指出的那样,它不是唯一的.其他差异包括:

  • 您不能使用'as'运算符强制转换为不接受'null'作为值的类型
  • 您不能使用'as' 事物(例如数字)转换为不同的表示形式(例如,float到int).

最后,使用'as'与演员操作员,你也说"我不确定这是否会成功."


den*_*nny 27

另请注意,您只能将as关键字与引用类型或可空类型一起使用

即:

double d = 5.34;
int i = d as int;
Run Code Online (Sandbox Code Playgroud)

不会编译

double d = 5.34;
int i = (int)d;
Run Code Online (Sandbox Code Playgroud)

将编译.

  • 因为铸造没有转换 (2认同)

Joe*_*Joe 11

使用"as"进行类型转换当然会在转换失败时更快,因为它避免了抛出异常的费用.

但是当演员成功时,它并不快.http://www.codeproject.com/KB/cs/csharpcasts.aspx上的图表具有误导性,因为它无法解释它的测量结果.

底线是:

  • 如果你期望演员阵容成功(即失败将是例外),使用演员.

  • 如果您不知道它是否会成功,请使用"as"运算符并将结果测试为null.


And*_*nea 6

好吧,“as”运算符“帮助”您将问题埋得更低,因为当提供不兼容的实例时,它将返回 null,也许您会将其传递给一个方法,该方法会将其传递给另一个方法,依此类推,最后您'将得到一个 NullReferenceException 这将使您的调试更加困难。

不要滥用它。在 99% 的情况下,直接转换运算符更好。


Cri*_*rdo 5

两种方法之间的区别在于第一种((SomeClass)obj)可能导致调用类型转换器.