繁体   English   中英

在 C# 中投射和使用“as”有什么区别?

[英]What is the difference between casting and using "as" in C#?

如果有区别,做以下演员的两种方式有什么区别?

在这种情况下, eGridViewRowEventArgs object。

GridView gv = (GridView)e.Row.FindControl("gv"); //first way

GridView gv2 = e.Row.FindControl("gv") as GridView; //second way

区别在于:

  • 如果强制转换失败,它会抛出InvalidCastException
  • 如果as运算符失败,它只会返回 null 引用。
  • 您不能将as用于不可为空的值类型(例如,您不能使用“ o as int ”)。
  • cast 运算符也用于拆箱。 as可用于拆箱为可空值类型。)
  • cast 运算符还可以执行用户定义的转换。

编辑:我在其他地方写过我觉得什么时候适合使用哪个运算符。 那可能值得一读……

-- why are you performing the conversion, and (more importantly) what happens on the lines after the conversion?上述答案中没有提到的是——你为什么要执行转换,以及(更重要的是)转换后的行会发生什么?

例如,我多次看到类似以下的代码:

if ((foo as SomeType).SomeMethod()) { /*... */ }

这可以与使用演员的版本进行比较:

if (((SomeType) foo).SomeMethod()) { /*... */ }

那么,这些中哪个更好呢?

演员是。

如果转换失败,使用as将导致NullReferenceException

如果转换失败,使用强制转换将导致InvalidCastException

现在告诉我,哪个对调试更有用? NullReferenceException几乎可以由任何东西产生,或者InvalidCastException可以让您知道实际出了什么问题?

use as if the conversion is optional (meaning that there be a null check before using the variable).因此,as转换可选的情况下使用(意味着在使用变量之前进行null检查)。 否则,请使用演员表,从而使您的意图更加明确。

一般来说,static 转换和“as”之间的区别在于,转换失败时会抛出异常,而“as”只会将变量设置为 null。

“as”语句基本上尝试强制转换变量,如果失败而不是抛出异常,则返回 null。 因此,您要转换的值必须是可为空的——引用类型或可为空的原语。 在您的示例中,您必须执行以下操作:

int? i2 = o as int;

或者它不会编译。

安全演员

variable as type

(variable is type) ? (type)variable : (type)null

并且不适用于值类型。

但是,如果您使用引用类型,例如 Table,则第一个将引发 InvalidCastException,以防 o 无法分配给 Table,而第二个只会返回 null。

除了 Jon 指出的问题之外, as关键字有效地将o转换为SomeClass 如果o不是从SomeClass派生的,则返回null 而简单的演员表会抛出异常。

SomeClass i2 = o as SomeClass;

变成

SomeClass i2;
if (o is SomeClass)
    i2 = (SomeClass)o;
else
    i2 = null;

我可能会在这里说明显而易见的事情,但是您使用“as”演员得到的一件事是,您可以保证最终得到您请求的类型的 object。 这在某些情况下会派上用场。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM