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

本文关键字:下定义 情况下 常数 情况 输入 数字 | 更新日期: 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类将PIE作为常量,它们直接在源代码中初始化。

相关文章: