我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
Const:Const只是“常量”,它的值是常量,但在编译时是常量。并且必须为其赋值。默认情况下,常量是静态的,我们不能在整个程序中更改常量变量的值。静态只读:静态只读类型变量的值可以在运行时赋值,也可以在编译时赋值,并在运行时更改。但该变量的值只能在静态构造函数中更改。并且不能进一步改变。它只能在运行时更改一次
参考:c-sharpcorner
其他回答
常量(在编译时确定)可用于只读静态不能使用的情况,如在switch语句或属性构造函数中。这是因为只读字段仅在运行时解析,并且某些代码构造需要编译时保证。只读静态可以在构造函数中计算,这通常是一个重要而有用的东西。区别是功能性的,我认为它们的用法也是如此。
在内存分配方面,至少对于字符串(作为引用类型)来说,似乎没有区别,因为两者都是内部的,并且将引用一个内部的实例。
就我个人而言,我的默认值是只读静态的,因为它对我来说更有语义和逻辑意义,尤其是因为大多数值在编译时都不需要。顺便说一句,公共只读静态数据并不罕见,正如标记的答案所示:例如,System.String.Empty就是其中之一。
我的偏好是尽可能使用const,正如前面的回答中所提到的,它仅限于字面表达或不需要求值的内容。
如果我碰到了这个限制,那么我会回退到静态只读,但有一个警告。我通常会使用带有getter和支持私有静态只读字段的公共静态属性,正如Marc在这里提到的。
静态只读:
可以在运行时通过静态构造函数更改该值。但不是通过成员函数。
常量:
默认情况下为静态。值不能从任何地方(构造函数、函数、运行时等)更改。
只读:
可以在运行时通过构造函数更改该值。但不是通过成员函数。
您可以查看我的存储库:C#属性类型。
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。静态只读字段避免了这个问题。
另一种看待这一点的方式是根据定义,未来的变化不是一成不变的,因此应该不能表示为一个。