在C#中使用"as"之间有什么区别?

Xai*_*oft 44 c#

如果存在差异,则执行以下演员的两种方式之间有什么区别?

在这种情况下e是一个GridViewRowEventArgs对象.

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

GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 77

不同之处是:

  • 如果一个演员表失败,它会抛出一个InvalidCastException.
  • 如果as运算符失败,则只返回空引用.
  • 您不能使用as不可为空的值类型(例如,您不能使用" o as int").
  • 演员操作员也用于拆箱.(as可用于将unbox转换为可为空的值类型.)
  • 演员操作员还可以执行用户定义的转换.

编辑:我在其他地方写过关于什么时候我觉得使用哪个运算符是合适的.这可能值得一读......


jon*_*onp 9

上述答案中没有提到的是意图 - 为什么要进行转换,(更重要的是)转换后的行会发生什么?

例如,我见过类似以下的代码:

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

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

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

那么,哪一个更好?

演员是.

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

使用强制InvalidCastException转换将导致转换失败.

现在告诉我,哪个调试更有用?A NullReferenceException,几乎可以通过任何东西生成,或者InvalidCastException让你知道究竟出了什么问题?

因此,使用as如果转换是实际可选的(意味着存在必须null检查使用变量之前).否则,使用演员,从而使你的意图更明确.