如何在不输入数字的情况下定义数学常数
本文关键字:下定义 情况下 常数 情况 输入 数字 | 更新日期: 2023-09-27 18:33:32
我需要在循环中使用 2 的平方根 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"的表达式必须是常量
如何最好地定义此值?
Math.Sqrt
是一个方法调用,因此不能分配给编译时常量。
只能将其分配给运行时常量:
static readonly double sqrt2 = Math.Sqrt(2);
尝试使用 static readonly
而不是 const
。
static readonly double sqrt2 = Math.Sqrt(2);
请理解,当您声明一个常量时,它必须是编译时常量。
C# 规范说:
常量表达式是可以在 编译时。
在 C# 中,常量初始值设定项必须编译 const,因为它们作为文本嵌入,而不是在编译期间使用。这意味着标记为 const
的成员的每次用法都将在编译期间替换为其值,而只读成员将在运行时解析。您可以改用static readonly
。
我认为您没有理由不将其初始化为常量。
在我看来,如果你对一个数字使用命名常量,那么这个数字就不是一个幻数。
你可以创建一个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
作为常量,它们直接在源代码中初始化。