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

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

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


当前回答

公共静态只读字段有点不寻常;公共静态财产(只有一个get)将更常见(可能由私有静态只读字段支持)。

常量值直接写入调用站点;这是双面的:

如果值是在运行时获取的,可能是从config获取的如果更改常量的值,则需要重建所有客户端但它可以更快,因为它避免了方法调用。。。…有时JIT可能会内联

如果该值永远不会改变,那么常量是好的-零等是合理的常量;p除此之外,静态财产更常见。

其他回答

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

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

需要注意的一点是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!

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

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

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

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

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

常量:

应在声明时给出值编译时间常数

只读:

值可以在声明时或在运行时使用构造函数给出。值可能会因使用的构造函数而异。运行时间常数