C#性能的影响和操作的变化

ner*_*tor 4 c# c++ optimization performance

常量通常用于C/C++编程中,作为产生更清晰代码的一种方式.有时也可能存在优化益处.但是,我想知道除了更易读的代码之外,从C#中声明值是只读还是在C#中可以获得什么好处.

假设我有以下C#代码:

public Double HalfPiSomething(Int32 input)
{
    return input + (Math.PI / 2);
}
Run Code Online (Sandbox Code Playgroud)

这是一个相当简单的例子,但每次调用该方法时,我们除以Math.PI2,将其添加到输入,并将其返回到调用语句.

让我们接受代码并Math.PI / 2在包含类的某个地方创建自己的变量:

private Double _halfPi = Math.PI / 2;

public Double HalfPiSomething(Int32 input)
{
    return input + _halfPi;
}
Run Code Online (Sandbox Code Playgroud)

显然,将其操作Math.PI / 2并将其置于自己的变量中是一个好主意,就像基本的编码实践一样,特别是如果所述值在类中的多个点中使用...它不是在这里,而是让我们假装.

最后,因为_halfPi永远不会改变让我们做到const:

private const Double _halfPi = Math.PI / 2;

public Double HalfPiSomething(Int32 input)
{
    return input + _halfPi;
}
Run Code Online (Sandbox Code Playgroud)

我想知道的是,除了作为C#的良好编码实践并使代码更容易理解并且更难以发现错误之外,还有什么好处 - 特别是关于性能 - 去做我上面做的事情?值是否会在本地内存中保留更长时间?

das*_*ght 6

每个方法被调用时,我们把Math.PI通过2,将它添加到输入,并将其返回给调用语句.

不,这不是正在发生的事情:C#编译器在编译时评估常量表达式.此外,当混合常量和非常量的表达式具有可在编译时计算的子表达式时,编译器会预先计算该值,就好像它是单个常量一样.

编译器将Math.PI / 2子表达式标识为常量,执行计算,并生成将输入添加到除法的预先计算结果的代码.

我想知道的是,除了作为C#的良好编码实践并使代码更容易理解并且更难以发现错误之外,还有什么好处 - 特别是关于性能 - 去做我上面做的事情?

不,没有理由做编译器的工作,除非它导致更清晰.

值是否会在本地内存中保留更长时间?

常量值被"烘焙"到编译器生成的代码中.它们不是本地数据存储器的一部分(尽管它们肯定在内存中,只要代码在内存中).