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
表示它是编译时常量,因为它不会在内存中创建位置;文本值内联在使用标识符的任何地方。