我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:

对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?

你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?


当前回答

我的偏好是尽可能使用const,正如前面的回答中所提到的,它仅限于字面表达或不需要求值的内容。

如果我碰到了这个限制,那么我会回退到静态只读,但有一个警告。我通常会使用带有getter和支持私有静态只读字段的公共静态属性,正如Marc在这里提到的。

其他回答

常量就像名称所暗示的那样,字段不会改变,通常在编译时在代码中静态定义。

只读变量是可以在特定条件下更改的字段。

它们可以在第一次像常量一样声明时初始化,但通常在构造函数内的对象构造期间初始化。

在上述条件下,初始化发生后不能更改它们。

静态只读对我来说听起来是一个糟糕的选择,因为如果它是静态的,并且它永远不会改变,那么就使用它public const。如果它可以改变,那么它不是常量,然后根据您的需要,您可以使用只读变量,也可以仅使用常规变量。

另外,另一个重要区别是常量属于类,而只读变量属于实例!

需要注意的一点是const仅限于基元/值类型(字符串除外)。

另外一个我不相信的区别是上面提到的:

常量和静态只读值不会在Visual Studio IDE中应用CodeLens。

static只获取财产,但会将CodeLens应用于这些属性。

我认为添加CodeLens非常有价值。

注意:当前正在使用Visual Studio 2022。

Const、readonly、static readonly-执行类似操作但有重要区别的关键字:

•Const-是一个变量,其值为常量,在编译时赋值。必须为其赋值。默认常量是静态的,我们不能在整个程序中更改常量变量的值。

•只读-意味着我们可以在运行时更改的值,也可以在运行时间分配它,但只能通过非静态构造函数。

•静态只读值​​可以在运行时分配,也可以在编译时分配,并在运行时更改。但该变量的值只能在静态构造函数中更改。并且不能进一步改变。在执行过程中只能更改一次。

您可以在此处找到示例-https://www.c-sharpcorner.com/UploadFile/c210df/difference-between-const-readonly-and-static-readonly-in-C-Sharp/

静态只读字段在暴露于其他程序集的值可能会在更高版本中更改。

例如,假设程序集X公开一个常量,如下所示:

public const decimal ProgramVersion = 2.3;

如果程序集Y引用X并使用该常量,则值2.3编译时将烘焙到程序集Y中。这意味着如果稍后重新编译X并将常量设置为2.4,则Y仍将使用旧值2.3直到重新编译Y。静态只读字段避免了这个问题。

另一种看待这一点的方式是根据定义,未来的变化不是一成不变的,因此应该不能表示为一个。