如果存在差异,则执行以下演员的两种方式之间有什么区别?
在这种情况下e
是一个GridViewRowEventArgs
对象.
GridView gv = (GridView)e.Row.FindControl("gv"); //first way GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Jon Skeet.. 77
不同之处是:
如果一个演员表失败,它会抛出一个InvalidCastException
.
如果as
运算符失败,则只返回空引用.
您不能使用as
不可为空的值类型(例如,您不能使用" o as int
").
演员操作员也用于拆箱.(as
可用于将unbox转换为可为空的值类型.)
演员操作员还可以执行用户定义的转换.
编辑:我在其他地方写过关于什么时候我觉得使用哪个运算符是合适的.这可能值得一读......
不同之处是:
如果一个演员表失败,它会抛出一个InvalidCastException
.
如果as
运算符失败,则只返回空引用.
您不能使用as
不可为空的值类型(例如,您不能使用" o as int
").
演员操作员也用于拆箱.(as
可用于将unbox转换为可为空的值类型.)
演员操作员还可以执行用户定义的转换.
编辑:我在其他地方写过关于什么时候我觉得使用哪个运算符是合适的.这可能值得一读......
上述答案中没有提到的是意图 - 为什么要进行转换,(更重要的是)转换后的行会发生什么?
例如,我见过类似以下的代码:
if ((foo as SomeType).SomeMethod()) { /* ... */ }
这可以与演员使用版本进行比较:
if (((SomeType) foo).SomeMethod()) { /* ... */ }
那么,哪一个更好?
演员是.
如果转换失败,则使用as
将导致NullReferenceException
.
使用强制InvalidCastException
转换将导致转换失败.
现在告诉我,哪个调试更有用?A NullReferenceException
,几乎可以通过任何东西生成,或者InvalidCastException
让你知道究竟出了什么问题?
因此,仅使用as
如果转换是实际可选的(意味着存在必须是null
检查使用变量之前).否则,使用演员,从而使你的意图更明确.