![](/img/trans.png)
[英]What's the difference between a Real Literal and Type Casting in C#?
[英]What is the difference between casting and using "as" in C#?
如果有区别,做以下演员的两种方式有什么区别?
在这种情况下, e
是GridViewRowEventArgs
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
”)。as
可用于拆箱为可空值类型。)编辑:我在其他地方写过我觉得什么时候适合使用哪个运算符。 那可能值得一读……
-- 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.