C#Cast Exception

时间:2011-01-03 17:52:27

标签: c# performance exception

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

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

中的开销

令人惊讶地缺乏有关C#异常性能主题的信息。

非常感谢你。

5 个答案:

答案 0 :(得分:9)

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

<强> BAD

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

不可

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

答案 1 :(得分:1)

这有两个原因。

  1. 例外情况很慢,性能受到很大影响。 Matt指出,我认为它不需要整整一毫秒,但它们足够慢,你想在正常操作中避免它们。
  2. 除非你有充分的理由,否则你不应该抓住空的例外。你只是隐藏了问题。程序崩溃比使用潜在危险的错误更好。
  3. 如果他们只是try { } finally { }组,那么一切都很好 - 那里没有开销。但是,try { } catch { }既有潜在危险又可能很慢。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

object someObject;
SomeType typedObject;

// fill someObject

typedObject = someObject as SomeType;

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

答案 4 :(得分:-1)

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

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