繁体   English   中英

C#Cast Exception

[英]C# Cast Exception

偶然发现了一些旧的代码,它们抛出并清空了一些强制转换异常(每次约20次:()

如果由于这个原因,性能受到影响该怎么办? 我应该担心这个,还是只是在try / catch中的开销

令人惊讶的是,缺少有关C#异常性能主题的信息。

谢谢,真的,来自你的。

例外情况会比大多数平均代码行减慢速度。 而不是强制转换然后捕获异常,而是进行检查。 例如

myType foo = (myType)obj;
foo.ExecuteOperation();

myType foo = obj as myType;
if (foo != null)
{
     foo.ExecuteOperation();
}

这有两个原因。

  1. 例外情况很慢,性能受到很大影响。 Matt指出,我认为它不需要整整一毫秒,但它们足够慢,你想在正常操作中避免它们。
  2. 除非你有充分的理由,否则你不应该抓住空的例外。 你只是隐藏了问题。 程序崩溃比它继续发生的潜在危险错误更好。

如果他们只是try { } finally { }组,那么一切都很好 - 那里没有开销。 但是, try { } catch { }既有潜在危险又可能很慢。

至于文档,这是非常好的: http//www.codeproject.com/KB/architecture/exceptionbestpractices.aspx#Don%27tuseexceptionhandlingasmeansofreturninginformationfromamethod18

编辑:刚刚意识到你说空捕捉异常,没有捕捉空异常。 无论哪种方式,除非您正在处理IO,否则您可能希望避免为了性能而这样做。

例外是昂贵的,性能方面的。 上次我测量这些时,它们需要大约一整毫秒才能抛出并捕获每个异常。

避免使用异常作为流量控制机制。

正如其他人所提到的,抛出时例外是昂贵的。 在某些情况下,他们无法避免。

但在这种情况下,听起来确实如此。

我建议在演员表之前使用as关键字。 这将告诉你演员是否成功,从而完全避免了Exception:

object someObject;
SomeType typedObject;

// fill someObject

typedObject = someObject as SomeType;

if(typedObject == null)
{
    // Cast failed
}

如果您没有遇到任何性能问题,这是您必须执行该算法的唯一方法,请继续使用此方法。

也许在尝试演员之前你可以看到一些if条款,如果你可以做演员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM