我知道此关键字的功能,但我想知道它在较低级别上是如何工作的。

哪一个更快?而且它们总是产生相同的结果吗?如果这样做,为什么会有两种不同的方式?

// Is there an overhead? An internal try catch?
Class123 obj = someobject as Class123;

if (Class123 != null)
{
    //OK
}

或者
Class123 obj = null;

if (someobject is Class123)
{
    obj = (Class123)someobject;
}

最佳答案

使用as关键字时,没有内部try-catch发生。据我所知,该功能内置于编译器/CLR中,因此类型检查是隐式且自动化的。

简单规则:
当您总是希望对象具有已知类型时,请使用直接强制转换(如果偶然是错误类型,则会收到有用的错误)。当对象始终是已知类型时,请使用as关键字。

存在as关键字的原因纯粹是为了程序员的方便(尽管您建议try-catch会更慢是正确的)。您可以指出,您可以自己手动实现它:

var castObj = (obj is NewType) ? (NewType)obj : null;

这突出了一个事实,即“as”关键字主要是出于简洁的目的而存在。

现在,两者之间的性能差异可能可以忽略不计。由于类型检查,as关键字可能稍微慢一些,但这在大多数情况下不太可能影响代码。如常说的那样,过早的优化绝不是明智的选择。如果您确实愿意,可以使用基准测试,但是我建议您只使用一种更适合您情况的方法,而不用担心性能(如果绝对需要,也可以稍后再考虑)。

关于c# - "as"关键字在内部如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/955347/

10-16 20:33