2015-07-11 76 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块将被输入当且仅当[条件为真。如果条件没有得到核实,该异常将向上冒泡堆栈,直到它抓住了别的地方或者终止的过程。” _ –