【发布时间】:2020-05-02 20:55:33
【问题描述】:
假设我的 C# 应用中有这个:
try{
Somethrowingmethod();
}catch(Exception ex){
throw new Exception("oops");
}
如果我保持我的代码不变,编译器会(理所当然地)抱怨我声明了 ex 但没有使用它。
所以我应该这样做:
try{
Somethrowingmethod();
}catch(Exception _){
throw new Exception("oops");
}
我的问题是,执行此操作后是否会提高性能?
还是只是为了干净的代码实践?
【问题讨论】:
-
干净的代码,这意味着您已经声明您打算丢弃异常。如果您不需要引用它,您可以只捕获异常而不声明它,但整个想法是显示异常链/堆栈,而不是仅仅抛出一个新异常并丢弃堆栈信息。这样做需要有充分的理由。
-
这声明了一个名为
Exception的变量_。这不是丢弃,并且应该针对未使用的变量发出相同的compiler warning。你可以catch(Exception){ }或者因为这无论如何都是一个问题,只是catch { },但你并没有从它们中获得任何性能提升。 -
不仅在本例中使用
_,在解析int.TryParse("foo", out _)时也只是一个语法糖。编译器会自动创建一个变量等,但它不会以任何方式影响性能 -
在这个例子中使用
_并不是放弃,所以不涉及语法糖。仅捕获异常类型是此处“丢弃”的正确方法,并且不会创建变量。但仍然没有从中获得性能提升。 -
编译器确实不抱怨这段代码。有一个代码分析规则对它提出建议,从 ex 下面的绿色曲线可见,应该告诉你根本不需要 ex。对那条摇摆狗的尾巴要小心一点。当您编写 try/catch-em-all/throw-something-else 代码时,在调试程序时让 ex 进行检查非常重要。你不应该写,但分析功能不够聪明,无法告诉你。