3

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

例如,一个类实现 Radial-Basis-Function 并且需要一些参数。目前,它们是这样的:

public class Interpolator {

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

    (...)
}

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

所以问题是:哪种是声明它们的“正确”方式?他们真的应该是static吗?他们不应该const吗?这种(相当常见的)模式通常如何在 C# 中实现关于良好实践的?

谢谢阅读!

4

3 回答 3

8

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

只需将它们声明为常量即可。const. 由于常量是隐式静态的,您可以使用您的类名访问它们。

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

public class Interpolator
{
    const int LAYERS = 6;
    const int MINIMUM_NEIGHBORS = 1;
    const double SEARCH_RADIUS = 20;
    const double START_RADIUS = 100;
}
于 2013-10-03T14:13:18.943 回答
1

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

readonly: 初始化后是否需要更改它们?

static:它们应该可以从其他程序集访问吗?

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

于 2013-10-03T14:13:58.553 回答
1

为了使用“不会改变的值”,您可以声明字段conststatic readonly

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) 程序集中Interpolator.SEARCH_RADIUS定义为 a const,并在另一个 (.exe) 程序集中使用它。

public const double SEARCH_RADIUS = 20;

如果将来您将定义更改为

private const double SEARCH_RADIUS = 10;

并重新编译您的 (.dll) 程序集。如果您不重新编译 (.exe) 程序集,它仍将使用a==100,因为SEARCH_RADIUS = 20它是在 .exe 编译期间使用的值。

如果你已经定义

public static readonly double SEARCH_RADIUS = 20;

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

于 2013-10-03T14:47:08.373 回答