Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 丢弃算子的性能优势_C#_Variables - Fatal编程技术网

C# 丢弃算子的性能优势

C# 丢弃算子的性能优势,c#,variables,C#,Variables,假设我的C#应用程序中有: 如果我保持代码的原样,编译器会(理所当然地)抱怨我声明了ex,但没有使用它 因此,我应该这样做: try{ Somethrowingmethod(); }catch(Exception _){ throw new Exception("oops"); } 我的问题是,一旦我这样做,是否会有性能提升 或者只是为了一个干净的代码实践?或者只是这样做 try{ Somethrowingmethod(); }catch(Exception){

假设我的C#应用程序中有:

如果我保持代码的原样,编译器会(理所当然地)抱怨我声明了ex,但没有使用它

因此,我应该这样做:

try{
    Somethrowingmethod();
}catch(Exception _){
    throw new Exception("oops");
}
我的问题是,一旦我这样做,是否会有性能提升

或者只是为了一个干净的代码实践?

或者只是这样做

try{
    Somethrowingmethod();
}catch(Exception){
    throw new Exception("oops");
}

但是没有性能差异

您的问题有缺陷,因为您的示例不涉及丢弃。相反,它将
异常
变量命名为
\uu
,并且仍应为未使用的变量发出相同的警告。请参阅示例并查看警告和生成的IL的
.locals init

.locals init (
  [0] class [System.Private.CoreLib]System.Exception
)
“放弃”异常的正确方法是仅捕获类型:

这并不声明一个局部变量,您可以在上面的链接中通过删除
\uu
并查看更新的
.locals init
部分来验证该局部变量(提示:它现在不存在了)

由于这是捕获基本异常类型,您还可以将其重写为:

try {
  DoSomething();
} catch {
  //... 
} 
但是,请注意,捕获所有/捕获基本
异常
类型通常不是一个好主意

不过,回到您最初的询问:在这些场景中,没有任何性能提升。充其量一个变量被省略,但真正的丢弃只是语法上的糖分,变量仍然被声明。此代码:

int.TryParse("1", out _);
仍然涉及类型为
int
的局部变量。您可以通过查看


但同样,没有性能提升

干净的代码,这意味着您已经声明要放弃该异常。如果不需要引用异常,您可以只捕获异常而不声明它,但整个思想是显示异常链/堆栈,而不是抛出新异常并丢弃堆栈信息。这样做需要有一个很好的理由。这声明了一个名为
\uu
Exception
类型的变量。它不是丢弃,应该对未使用的变量发出相同的消息。您可以
catch(Exception){}
,或者因为这是一个“一网打尽”的方法,所以只
catch{}
,但您并没有从任何一个方法中获得性能提升。使用
不仅在本例中,而且在解析
int.TryParse(“foo”,out)
时也只是一种语法上的糖分。编译器将自动创建一个变量etc,但它不会以任何方式影响性能。在本例中,使用
并不是一个放弃,所以不涉及语法糖。仅捕获异常类型是此处“放弃”的正确方式,并且不会创建变量。但是,仍然没有从中获得性能提升。编译器不会抱怨这段代码。有一个代码分析规则,它给出了一个关于它的建议,从ex下面的绿色曲线可以看到,应该告诉您根本不需要ex。对那条摇尾巴的狗一定要小心一点。当您编写try/catch-em-all/throw其他代码时,在调试程序时让ex检查是相当重要的。这是你永远不应该写的,但是分析功能还不足以告诉你这一点。谢谢你的回答。这是超级澄清。
try {
  DoSomething();
} catch {
  //... 
} 
int.TryParse("1", out _);
.locals init (
  [0] int32
)