哪个用于C#中的算法参数:static,const,readonly?

时间:2013-10-03 14:11:39

标签: c# parameters static const

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

例如,一个类实现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#中,这种(相当普遍的)模式通常如何实现良好实践?

感谢阅读!

3 个答案:

答案 0 :(得分:8)

  

这里的想法是确定这些参数   实验上,理想情况下不应该改变,甚至不应该改变   构造

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

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分: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定义为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)程序集将自动获得更改,而无需重新编译。