偶然发现了一些旧的代码,它们抛出并清空了一些强制转换异常(每次约20次:()
如果由于这个原因,性能受到影响该怎么办?我应该担心这个,还是只是在try / catch
中的开销令人惊讶地缺乏有关C#异常性能主题的信息。
非常感谢你。
答案 0 :(得分:9)
例外情况会比大多数平均代码行减慢速度。而不是强制转换然后捕获异常,而是进行检查。例如
<强> BAD 强>
myType foo = (myType)obj;
foo.ExecuteOperation();
不可强>
myType foo = obj as myType;
if (foo != null)
{
foo.ExecuteOperation();
}
答案 1 :(得分:1)
这有两个原因。
如果他们只是try { } finally { }
组,那么一切都很好 - 那里没有开销。但是,try { } catch { }
既有潜在危险又可能很慢。
编辑:刚刚意识到你说空捕捉异常,而不是捕捉空异常。无论哪种方式,除非您正在处理IO,否则您可能希望避免为了性能而这样做。
答案 2 :(得分:0)
例外是昂贵的,性能方面的。上次我测量这些时,他们正在大约一整毫秒来抛出并捕获每个异常。
避免将异常用作流量控制机制。
答案 3 :(得分:0)
正如其他人所提到的,抛出时例外是昂贵的。在某些情况下,他们是无法避免的。
在这种情况下,听起来确实如此。
我建议在演员之前使用as
关键字。这将告诉你演员是否成功,从而完全避免了例外:
object someObject;
SomeType typedObject;
// fill someObject
typedObject = someObject as SomeType;
if(typedObject == null)
{
// Cast failed
}
答案 4 :(得分:-1)
如果您没有遇到任何性能问题,这是您必须执行该算法的唯一方法,请继续使用此方法。
也许在尝试演员之前,你可以看到一些if
条款,如果你可以进行演员表。