如何在不输入数字的情况下定义数学常数?

时间:2016-02-05 14:22:50

标签: c# .net

我需要在循环中使用两个平方根1.414 ....

显然,我不想一直调用函数Math.Sqrt(2)。当然,它是现代处理器上的单一指令,JIT或编译器可能会弄清楚发生了什么,但我希望我的代码清晰,可读,快速。

因为我希望我的代码清晰易读,所以我更愿意通过调用sqrt2 = Math.Sqrt(2)来定义此常量,而不是输入幻数sqrt2 = 1.4142135623731d

最后,因为这个值是一个常量,我想用const关键字声明它。但是当我写道:

const double sqrt2 = Math.Sqrt(2);
// const double sqrt2 = 1.4142135623731d;

编译器抱怨:

  

错误1表达式分配给' sqrt2'必须是不变的

如何最好地定义此值?

4 个答案:

答案 0 :(得分:9)

Math.Sqrt是方法调用,因此无法分配给编译时常量。
您只能将其分配给运行时常量

static readonly double sqrt2 = Math.Sqrt(2);

答案 1 :(得分:6)

您可以尝试使用static readonly代替const

static readonly double sqrt2 = Math.Sqrt(2);

理解当你声明一个常量时,它必须是编译时常量。

C# spec说:

  

常量表达式是一个可以在中完全计算的表达式   编译时间。

答案 2 :(得分:1)

在C#中,常量初始化器必须是编译const,因为它们在编译期间作为文字嵌入而不是使用。这意味着标记为const的成员的每次使用都将在编译期间替换为其值,而readonly成员将在运行时解析。您可以改为使用static readonly

答案 3 :(得分:1)

我认为没有理由不将它初始化为常数。

在我看来,如果你对一个数字使用命名常量,那么这个数字不是一个幻数。

你可以创建一个MathematicalConstants类来保存它和其他值:

public static class MathematicalConstants
{
    public const double SQRT2 = 1.4142135623731d;
    public const double SQRT3 = 1.7320508075689d;
}

然后,如果您使用C#6或更高版本,则可以输入

using static MathematicalConstants;

在代码模块的开头,您不需要将其称为MathematicalConstants.SQRT2。您可以在代码中使用SQRT2

const double sin45 = 1/SQRT2;
const double tan30 = 1/SQRT3;

顺便说一下,将常量放在静态类中的先例。 Math类有PIE作为常量,它们直接在源代码中初始化。