我有一些类,其方法实现了科学的数值算法。
例如,一个类实现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#中,这种(相当普遍的)模式通常如何实现良好实践?
感谢阅读!
答案 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)
要使用“不会更改的值”,您可以声明const
或static readonly
字段:
public class Interpolator
{
// Free parameters
static readonly int LAYERS = 6;
const int MINIMUM_NEIGHBORS = 1;
}
为了决定其中一个,我使用以下标准:
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)程序集将自动获得更改,而无需重新编译。