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

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

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


当前回答

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。静态只读字段避免了这个问题。

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

常量(在编译时确定)可用于只读静态不能使用的情况,如在switch语句或属性构造函数中。这是因为只读字段仅在运行时解析,并且某些代码构造需要编译时保证。只读静态可以在构造函数中计算,这通常是一个重要而有用的东西。区别是功能性的,我认为它们的用法也是如此。

在内存分配方面,至少对于字符串(作为引用类型)来说,似乎没有区别,因为两者都是内部的,并且将引用一个内部的实例。

就我个人而言,我的默认值是只读静态的,因为它对我来说更有语义和逻辑意义,尤其是因为大多数值在编译时都不需要。顺便说一句,公共只读静态数据并不罕见,正如标记的答案所示:例如,System.String.Empty就是其中之一。

有一个重要的问题,在上面的答案中没有提到,应该会促使您更喜欢“const”,特别是对于“int”、“string”等基本类型。

常量可以用作属性参数,静态只读字段不能!

Azure函数HttpTrigger,未在属性中使用HttpMethods类

如果微软为Http的GET、POST、DELETE等使用常量就好了。

可以写

[HttpTrigger(AuthorizationLeve.Anonymous,  HttpMethods.Get)] // COMPILE ERROR: static readonly, 

但我不得不求助于

[HttpTrigger(AuthorizationLeve.Anonymous,  "GET")] // STRING

或者使用我自己的常量:

public class HttpConstants
{
    public const string Get = "GET";
}

[HttpTrigger(AuthorizationLeve.Anonymous,  HttpConstants.Get)] // Compile FINE!

声明常量和静态只读之间的另一个区别在于内存分配。

静态字段属于对象的类型,而不是该类型的实例。因此,一旦类第一次被引用,静态字段将在剩余时间内“驻留”在内存中,并且静态字段的同一实例将被该类型的所有实例引用。

另一方面,常量字段“属于该类型的实例。

如果释放的内存对您来说更重要,请使用const。如果是速度,则使用静态只读。