我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
我的偏好是尽可能使用const,正如前面的回答中所提到的,它仅限于字面表达或不需要求值的内容。
如果我碰到了这个限制,那么我会回退到静态只读,但有一个警告。我通常会使用带有getter和支持私有静态只读字段的公共静态属性,正如Marc在这里提到的。
其他回答
有一个重要的问题,在上面的答案中没有提到,应该会促使您更喜欢“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仅限于基元/值类型(字符串除外)。
需要注意的几个相关事项:
常量int a
必须初始化。初始化必须在编译时进行。
只读int a
可以使用默认值,而无需初始化。初始化可以在运行时完成(编辑:仅在构造函数内)。
另外一个我不相信的区别是上面提到的:
常量和静态只读值不会在Visual Studio IDE中应用CodeLens。
static只获取财产,但会将CodeLens应用于这些属性。
我认为添加CodeLens非常有价值。
注意:当前正在使用Visual Studio 2022。
如果Consumer位于不同的程序集中,我将使用静态只读。将const和Consumer放在两个不同的集合中是一个很好的方法来击中自己的脚。