C#中的算法参数使用哪种:静态、常量、只读?

C#中的算法参数使用哪种:静态、常量、只读?,c#,parameters,static,constants,C#,Parameters,Static,Constants,我有一些类的方法实现了科学的数值算法 例如,一个类实现了径向基函数,需要一些参数。目前,它们是这样的: public class Interpolator { // Free parameters static int LAYERS = 6; static int MINIMUM_NEIGHBORS = 1; static double SEARCH_RADIUS = 20; static double START_RADIUS = 100;

我有一些类的方法实现了科学的数值算法

例如,一个类实现了径向基函数,需要一些参数。目前,它们是这样的:

public class Interpolator {

    // Free parameters
    static int LAYERS = 6;
    static int MINIMUM_NEIGHBORS = 1;
    static double SEARCH_RADIUS = 20;
    static double START_RADIUS = 100;

    (...)
}
这里的想法是,这些参数将通过实验确定,理想情况下,即使通过配置也不应改变

所以问题是:哪一种是“正确”的声明方式?它们实际上应该是静态的吗?它们不应该是常量吗?这种(相当常见的)模式通常是如何在C#中实现的

谢谢你的阅读

这里的想法是这些参数将被确定 在实验上,理想情况下不应改变,甚至不应通过 配置

只需将它们声明为常量<代码>常量。因为常量是隐式静态的,所以可以使用类名访问它们

如果将它们定义为静态,那么也可以修改它们

public class Interpolator
{
    const int LAYERS = 6;
    const int MINIMUM_NEIGHBORS = 1;
    const double SEARCH_RADIUS = 20;
    const double START_RADIUS = 100;
}

要给出一个简洁实用的答案:

readonly
:在初始化它们之后,您是否需要更改它们

static
:是否可以从其他程序集访问它们

const
:如果您对前两个问题的回答为否,请使用const。

为了使用“不会更改的值”,您可以声明字段
const
静态只读

public class Interpolator 
{
  // Free parameters
  static readonly int LAYERS = 6;
  const int MINIMUM_NEIGHBORS = 1;
}
要选择其中一个,我使用以下标准:

  • 如果仅在此程序集中(Visual Studio中的此项目)访问它,请使用
    const
  • 如果其他程序集可以访问它,请使用
    static readonly
改进您的示例:

public class Interpolator 
{
  // Free parameters
  public static readonly int LAYERS = 6;
  internal const int MINIMUM_NEIGHBORS = 1; // internal means public to this assembly but private to other assemblies.
  private const double SEARCH_RADIUS = 20;
}

为什么要这样区分? 当编译器在表达式中找到一个
const
字段时,它用该字段的值替换该字段并对其进行编译。这是非常有效的

int a = 5 * Interpolator.SEARCH_RADIUS;
汇编如下:

int a = 100;
但假设您在一个(.dll)程序集中定义了一个
常量
,并在另一个(.exe)程序集中使用它

public const double SEARCH_RADIUS = 20;
如果将来您将定义更改为

private const double SEARCH_RADIUS = 10;
并重新编译(.dll)程序集。如果不重新编译(.exe)程序集,它仍将使用
a==100
,因为
SEARCH\u RADIUS=20
是它在.exe编译过程中使用的值

如果你已经定义了

public static readonly double SEARCH_RADIUS = 20;

在.dll中,当您将值更改为
10
并仅重新编译(.dll)程序集时,另一个(.exe)程序集将自动获得更改,而无需重新编译。

非常有用的信息。但是这些变量是私有的,只在这个类的方法中使用。@heltonbiker,如果它们是私有的,那么它们在类外是不可访问的,但是仍然将它们作为
const
将避免您意外修改这些变量。很好,这就是想法。即使这个项目完全在内部编程,您提到的这些意外(错误)修改也可以随时发生。谢谢这不是完全正确的
readonly static
const
不同。如果它是
readonly static
,则它是一个变量,并占用内存中的一个位置。它也可以是非文字值,甚至可以在运行时生成(只要在初始化后不更改)
const
表示它是编译时常量,因为它不会在内存中创建位置;文本值内联在使用标识符的任何地方。