来自文档:
as运算符就像一个转换器,除了它在转换失败时产生null而不是引发异常.更正式地说,表达形式:
Run Code Online (Sandbox Code Playgroud)expression as type相当于:
Run Code Online (Sandbox Code Playgroud)expression is type ? (type)expression : (type) null除了表达式只评估一次.
那你为什么不选择这样或那样做呢?为什么有两个铸造系统?
Eri*_*ert 81
它们不是两个铸造系统.两者有类似的行为,但意义却截然不同."as"表示"我认为这个对象可能实际上属于另一种类型;如果不是,则给我null." 演员表示两件事之一:
我确信这个对象实际上是另一种类型.这样做,如果我错了,请崩溃程序.
我确信这个对象不属于其他类型,但是有一种众所周知的方法可以将当前类型的值转换为所需类型.(例如,将int转换为short.)实现它,如果转换实际上不起作用,则使程序崩溃.
有关详细信息,请参阅我关于此主题的文章.
Amb*_*ber 12
因为如果你不能像你期望的那样进行投射,有时候你会想要失败,有时候你不关心,如果它不能投射,只想丢弃一个给定的对象.
它基本上是一个包含在try块中的常规强制转换的更快版本; 但As更具可读性,也节省了打字.
STW*_*STW 12
效率和绩效
执行演员的一部分是一些综合类型检查; 因此,使用显式类型检查为实际强制转换添加前缀是多余的(类型检查会发生两次).使用该as关键字确保只执行一次类型检查.您可能会想"但它必须执行空检查而不是第二次类型检查",但与类型检查相比,空检查非常有效且高效.
if (x is SomeType )
{
SomeType y = (SomeType )x;
// Do something
}
Run Code Online (Sandbox Code Playgroud)
进行2次检查,而
SomeType y = x as SomeType;
if (y != null)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
生成1x - 与类型检查相比,空检查非常便宜.
小智 7
它允许快速检查而不需要尝试/转换开销,在某些情况下可能需要处理基于消息的继承树.
我使用它很多(收到消息,对特定的子类型做出反应).尝试/施放wouuld要慢得多(每条消息都经过多次尝试/捕获帧) - 我们谈到在这里每秒处理200.000条消息.
| 归档时间: |
|
| 查看次数: |
19973 次 |
| 最近记录: |