ric*_*ard 8 .net c# casting explicit
我明白当你使用这样的显式演员时:
(someType)someobject
Run Code Online (Sandbox Code Playgroud)
如果someobject不是真的,你可以得到一个无效的强制转换异常someType.
我也明白,当你这样投射时as:
myObject = someObject as someType
Run Code Online (Sandbox Code Playgroud)
myObjectnull如果someObject不是真的,那就是渲染someType.
这些评估方式有何不同?为什么?
John Skeet有一个C#faq,他解释了两个运营商之间的差异.请参阅"使用强制语法和as运算符之间有什么区别?"一节.
Quote:
使用as运算符与C#中的强制转换器有三个不同的重要方面:
- 当您尝试转换的变量不是请求的类型或其继承链时,它返回null,而不是抛出异常.
- 它只能应用于转换为引用类型的引用类型变量.
- 使用as不会执行用户定义的转换,例如隐式或显式转换运算符,这些转换运算符将执行转换.
实际上在IL中定义了两个完全不同的操作来处理这两个关键字(castclass和isinst指令) - 它不仅仅是由C#编写的"语法糖"来获得这种不同的行为.与投射相比,微软CLR的v1.0和v1.1中的as运算符似乎略快一些(即使在没有无效的强制转换的情况下,由于异常会严重降低投射的性能).
| 归档时间: |
|
| 查看次数: |
3858 次 |
| 最近记录: |