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

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

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

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

===============>>#1 票数:85 已采纳

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

[编辑]

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

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

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

===============>>#2 票数:27

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

即:

double d = 5.34;
int i = d as int;

不会编译

double d = 5.34;
int i = (int)d;

将编译。

===============>>#3 票数:11

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

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

底线是:

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

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

===============>>#4 票数:5

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

===============>>#5 票数:4

这是一个很好的方式来记住他们每个人在尝试决定哪个更适合我的环境时使用的过程。

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

接下来应该很容易猜到它的作用

DateTime i = value as DateTime;

在第一种情况下,如果无法转换值,则在第二种情况下抛出异常,如果无法转换该值,则将i设置为null。

因此,在第一种情况下,如果在第二次投射中投射失败,则进行硬停止,并且稍后可能会遇到NullReferenceException。

===============>>#6 票数:4

那么'as'运算符“帮助”你把你的问题埋没得更低,因为当它被提供一个不兼容的实例时它会返回null,也许你会把它传递给一个方法,它将它传递给另一个等等,最后你'我会得到一个NullReferenceException,这将使您的调试更加困难。

不要滥用它。 99%的情况下直接投射算子更好。

===============>>#7 票数:3

要扩展Rytmis的注释 ,不能对结构(值类型)使用as关键字,因为它们没有空值。

===============>>#8 票数:2

所有这些都适用于引用类型,值类型不能使用as关键字,因为它们不能为null。

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

强制转换语法更快,但只有成功时,失败才会慢得多。

最好的做法是使用as ,当你不知道类型:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

但是,如果您完全确定someObjectSomeClass的实例,那么使用SomeClass

在.Net 2或更高版本中,泛型意味着您很少需要具有引用类的未键入实例,因此后者使用较少。

===============>>#9 票数:1

如果转换尝试失败,则括号转换会抛出异常。 如果转换尝试失败,“as”强制转换将返回null。

===============>>#10 票数:1

他们会抛出不同的例外。
():NullReferenceException
as:InvalidCastException
哪个可以帮助调试。

“as”关键字尝试转换对象,如果转换失败,则以静默方式返回null。 如果转换失败,()强制转换运算符将立即抛出异常。

“只使用C#”作为“关键字,你希望转换在非特殊情况下失败。如果你指望一个演员成功并且没有准备接收任何失败的对象,你应该使用()抛出运算符,以便抛出适当且有用的异常。“

有关代码示例和进一步说明,请访问: http//blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

===============>>#11 票数:1

这就像Parse和TryParse之间的区别。 当你期望它可能失败时,你使用TryParse,但是当你有强有力的保证时,你使用Parse就不会失败。

===============>>#12 票数:1

对于那些具有VB.NET经验的人来说,(type)与DirectCast相同,“as type”与TryCast相同。

  ask by Michael Stum translate from so

未解决问题?本站智能推荐: