1、catch throw的幾種形式及性能影響:
對應的il代碼(以下代碼是release版本的il代碼):
可以看到form1_click、form1_load、form1_enter中的try catch已經被編譯器優化掉了:
隻有form1_doubleclick中的try catch中對try catch進行了處理:
即在form1_doubleclick中的try catch才會對性能産生影響。
==》可以看出一下三種try catch的寫法對于release版本的代碼來說是完全一樣,也不會産生任何的性能消耗:
對于上面的結論大家可以寫測試demo驗證一下 (已測試,結果與分析一緻
)。
那麼對于debug模式下的il代碼是什麼樣子的呢?
可以看出四種寫法在debug模式下差別隻是:rethrow與throw的差別。il中rethrow與throw分别代表啥呢?
throw:引發目前位于計算堆棧上的異常對象。
rethrow:再次引發目前異常。
即當我們抛出一個異常時, clr會重新設定一個異常起始點。 clr隻記錄最近一次異常抛出的位置。下面代碼抛出一個異常,進而導緻clr重新設定該異常的起始點:
相反,如果我們抛出一個異常對象, clr将不會重新設定其堆棧的起始點,下面代碼抛出一個異常,但不會導緻clr重新設定異常的起始點:
c#中使用throw和throw ex抛出異常,但二者是有差別的。
在c#中推薦使用throw;來抛出異常;throw ex;會将到現在為止的所有資訊清空,認為你catch到的異常已經被處理了,隻不過處理過程中又抛出新的異常,進而找不到真正的錯誤源。
throw e重新抛出異常,并非轉發原來的異常,而會更改包括stacktrace在内的許多異常内部資訊;對于調用連很深情況,性能損耗超出想象。
拓展閱讀:
<a target="_blank" href="http://blog.csdn.net/jiankunking/article/details/49443493">il指令詳細</a>