Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 在.NET中,块级别与功能级别的作用域是否存在性能影响_C#_.net_Performance_Scope - Fatal编程技术网

C# 在.NET中,块级别与功能级别的作用域是否存在性能影响

C# 在.NET中,块级别与功能级别的作用域是否存在性能影响,c#,.net,performance,scope,C#,.net,Performance,Scope,我在查看一些C#代码时遇到了一些变量,这些变量的作用域是函数级的,我应该在使用它们的代码块(本例中是一个循环)中对其进行作用域。对我来说,尽可能接近的范围更清晰、更容易推理,这足以让我更喜欢块级范围。但我想知道,是否有任何显著的性能影响?根本没有性能差异 变量范围与变量生存期不同。变量是在函数的堆栈帧中创建的,不管它是在函数范围中声明的还是在函数的代码块中声明的。变量存在于整个函数执行过程中,只有编译器根据变量的作用域限制对变量的访问 (请注意,如果变量实际上是闭包的一部分,而不是常规局部变量,

我在查看一些C#代码时遇到了一些变量,这些变量的作用域是函数级的,我应该在使用它们的代码块(本例中是一个循环)中对其进行作用域。对我来说,尽可能接近的范围更清晰、更容易推理,这足以让我更喜欢块级范围。但我想知道,是否有任何显著的性能影响?

根本没有性能差异

变量范围与变量生存期不同。变量是在函数的堆栈帧中创建的,不管它是在函数范围中声明的还是在函数的代码块中声明的。变量存在于整个函数执行过程中,只有编译器根据变量的作用域限制对变量的访问


(请注意,如果变量实际上是闭包的一部分,而不是常规局部变量,则适用不同的规则。)

t这取决于循环和变量的大小——在大多数情况下,可能与@AlexKrups没有差异,是吗?我想编译器会以任何一种方式将声明从循环中提出来。这没有任何区别。NET编译器生成MSIL,它没有块作用域的概念。有关抖动如何跟踪在中使用的局部变量的一些详细信息。只关注编写可读代码。在没有看到代码的情况下无法进行注释。请提供有问题的代码。当然,JITter可以自由地重用寄存器或堆栈的一部分,用于具有非重叠生存时间的多个变量。这就是我所说的,虽然我曾认为范围的不同可能会影响垃圾收集。@MatthewNichols:实际上它也不会影响垃圾收集(调试模式除外)。垃圾收集器只关心引用在代码中的何处使用,变量的作用域和生存期是无关的。@Guffa是的,这就是我从你的答案中得出的结论。我应该重温一下我的垃圾收集知识。