我需要在循环中使用两个平方根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'必须是不变的
如何最好地定义此值?
答案 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
类有PI
和E
作为常量,它们直接在源代码中初始化。