c# -转换:(NewType)与作为NewType的对象

Translate

可能重复:
在CLR中投放与使用'as'关键字

这两个演员之间的实际区别是什么?

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

如果源类型不能转换为目标类型,则前者将引发异常。后者将导致sc2为空引用,但也不例外。

[编辑]

我的原始答案当然是最明显的不同,但作为埃里克·利珀特(Eric Lippert)指出,这不是唯一的一个。其他差异包括:

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

最后,使用“ as”与强制转换运算符,您还说“我不确定是否会成功”。

来源
Translate

还要注意,您只能将as关键字与引用类型或可为空的类型一起使用

即:

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

不会编译

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

将编译。

来源
Joe
Translate

当强制转换失败时,使用“ as”进行类型转换当然要快得多,因为它避免了引发异常的开销。

但是当转换成功时并不会更快。图在http://www.codeproject.com/KB/cs/csharpcasts.aspx有误导性,因为它没有解释测量的内容。

底线是:

  • 如果您期望强制转换成功(即失败将是例外),请使用强制转换。

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

来源
Translate

两种方法之间的区别在于,第一种((SomeClass)obj)可能会导致类型转换器被称为。

来源
Translate

这是记住他们每个人遵循的过程的一种好方法,当我尝试确定哪种方法更适合我的情况时。

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。

来源
Translate

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

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

来源
Translate

扩大Rytmis的评论,您不能使用as结构(值类型)的关键字,因为它们没有空值。

来源
Translate

所有这些都适用于引用类型,值类型不能使用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
}

但是,如果您绝对确定someObject是...的实例SomeClass然后使用演员表。

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

来源
Cecilia Lee
Translate

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

来源
Translate

他们会抛出不同的异常。
():NullReferenceException
如:InvalidCastException
这可能有助于调试。

关键字“ as”尝试转换对象,如果转换失败,则无提示返回null。如果强制转换失败,则()强制转换运算符将立即引发异常。

“仅在预期异常情况下强制转换失败的地方使用C#“ as”关键字。如果您期望强制转换成功并且不准备接收任何可能失败的对象,则应使用()强制转换运算符,以便抛出适当且有用的异常。”

有关代码示例和进一步的解释:http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

来源
ICR
Translate

就像Parse和TryParse之间的区别一样。当您期望TryParse可能会失败时,可以使用它,但是当您确信它不会失败时,请使用Parse。

来源
Translate

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

来源