2015-07-11 95 views
0

可做C在VS2015推出#異常篩選對性能,內存使用或堆棧中的任何效果時,拋出一個異常?C#異常過濾器性能

例外濾波器:

try { … } 
catch (Exception e) when (e.Message == "Hello world") 
{ 
    // do stuff 
} 

詩傳統捕獲並重新擲:

try { … } 
catch (Exception e) 
{ 
    if (e.Message == "Hello world") 
    { 
     // do stuff 
    } 
    else 
    { 
     throw; 
    } 
} 
+1

【如何對自己衡量它?(http://ericlippert.com/2012/12/17/performance-rant/) –

+0

你不應該拋出異常10000 /秒所以它真的不應該的問題。 –

+2

嗨Soner Gonul,我在這裏問,互聯網協作找到答案,然後從現在開始直到結束的每個人都可以找到與他們選擇的搜索引擎的答案? –

回答

2

例外濾波的新的C#6.0特徵基本上翻轉周圍捕獲異常,然後檢查條件的邏輯。

的區別是:

  • 在第一個例子,你先檢查車況,然後可能捕捉異常。
  • 在第二個例子中,你每次捕獲異常,然後再決定基於內的條件什麼。

所以我不確定什麼是確切的性能影響,但我認爲你總體上更好。

如果條件不符合,那麼您就不必展開堆棧,否則會產生捕獲和重新拋出的成本(異常不會被捕獲/重新拋出......它根本沒有被捕獲),或者執行您可能在catch聲明中包含的任何其他邏輯。

+0

你有這方面的來源嗎?許多新的好東西只是語法糖,以幫助人們編寫更乾淨的代碼,所以我認爲這可能實際上被編譯爲捕獲異常,檢查並在需要時再次拋出異常。儘管如此,我還沒有真正研究過它,所以更多的可靠信息將會非常棒! –

+1

@卡爾 - 約翰·好了,不知道如何權威,你正在尋找(即在微軟開發團隊的人)的來源,但我認爲[詹姆斯·邁克爾·黑爾(http://geekswithblogs.net/BlackRabbitCoder/archive/ 2015/04/09/c.net-little-wonders-exception-filtering-in-c-6.aspx)(C#MVP)是一個可靠的來源。 –

+1

@卡爾 - 約翰我還考慮[托馬斯·萊維斯克(http://www.thomaslevesque.com/2015/06/21/exception-filters-in-c-6/)(另一個MVP)的可靠來源: _「[T]他catch塊將被輸入當且僅當[條件爲真。如果條件沒有得到覈實,該異常將向上冒泡堆棧,直到它抓住了別的地方或者終止的過程。」 _ –