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

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

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


当前回答

有一个重要的问题,在上面的答案中没有提到,应该会促使您更喜欢“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仅限于基元/值类型(字符串除外)。

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

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

public const decimal ProgramVersion = 2.3;

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

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

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

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

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

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

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

Const:Const只是“常量”,它的值是常量,但在编译时是常量。并且必须为其赋值。默认情况下,常量是静态的,我们不能在整个程序中更改常量变量的值。静态只读:静态只读类型变量的值可以在运行时赋值,也可以在编译时赋值,并在运行时更改。但该变量的值只能在静态构造函数中更改。并且不能进一步改变。它只能在运行时更改一次

参考:c-sharpcorner

静态只读:

可以在运行时通过静态构造函数更改该值。但不是通过成员函数。

常量:

默认情况下为静态。值不能从任何地方(构造函数、函数、运行时等)更改。

只读:

可以在运行时通过构造函数更改该值。但不是通过成员函数。

您可以查看我的存储库:C#属性类型。