C#中"As"关键字的重点是什么?

ast*_*ght 55 c# keyword

来自文档:

as运算符就像一个转换器,除了它在转换失败时产生null而不是引发异常.更正式地说,表达形式:

   expression as type
Run Code Online (Sandbox Code Playgroud)

相当于:

  expression is type ? (type)expression : (type) null
Run Code Online (Sandbox Code Playgroud)

除了表达式只评估一次.

那你为什么不选择这样或那样做呢?为什么有两个铸造系统?

Eri*_*ert 81

它们不是两个铸造系统.两者有类似的行为,但意义却截然不同."as"表示"我认为这个对象可能实际上属于另一种类型;如果不是,则给我null." 演员表示两件事之一:

  • 我确信这个对象实际上是另一种类型.这样做,如果我错了,请崩溃程序.

  • 我确信这个对象不属于其他类型,但是有一种众所周知的方法可以将当前类型的值转换为所需类型.(例如,将int转换为short.)实现它,如果转换实际上不起作用,则使程序崩溃.

有关详细信息,请参阅我关于此主题的文章.

http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

  • 对于C++思想家来说,C#中的`as`类似于C++中的`dynamic_cast`. (4认同)

Amb*_*ber 12

因为如果你不能像你期望的那样进行投射,有时候你会想要失败,有时候你不关心,如果它不能投射,只想丢弃一个给定的对象.

它基本上是一个包含在try块中的常规强制转换的更快版本; 但As更具可读性,也节省了打字.

  • 字典和枚举有安全返回方法,它们分别称为TryGetValue和TryParse ...... (2认同)

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 - 与类型检查相比,空检查非常便宜.

  • 为什么那里有一个类型?这没有任何意义. (4认同)

小智 7

它允许快速检查而不需要尝试/转换开销,在某些情况下可能需要处理基于消息的继承树.

我使用它很多(收到消息,对特定的子类型做出反应).尝试/施放wouuld要慢得多(每条消息都经过多次尝试/捕获帧) - 我们谈到在这里每秒处理200.000条消息.

  • 只是好奇你或者Amber对于try/catch是否正确 - 听起来像`as`确实将操作包装在Try-block中,但是可能使用更高效的转换机制? (3认同)