我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
需要注意的一点是const仅限于基元/值类型(字符串除外)。
其他回答
readonly关键字与const关键字不同。常量字段只能在字段声明处初始化。只读字段可以在声明或构造函数中初始化。因此,只读字段可以具有不同的值,具体取决于所使用的构造函数。此外,虽然const字段是编译时常量,但只读字段可以用于运行时常量
从这个简短而清晰的MSDN参考中。
需要注意的几个相关事项:
常量int a
必须初始化。初始化必须在编译时进行。
只读int a
可以使用默认值,而无需初始化。初始化可以在运行时完成(编辑:仅在构造函数内)。
静态只读字段在暴露于其他程序集的值可能会在更高版本中更改。
例如,假设程序集X公开一个常量,如下所示:
public const decimal ProgramVersion = 2.3;
如果程序集Y引用X并使用该常量,则值2.3编译时将烘焙到程序集Y中。这意味着如果稍后重新编译X并将常量设置为2.4,则Y仍将使用旧值2.3直到重新编译Y。静态只读字段避免了这个问题。
另一种看待这一点的方式是根据定义,未来的变化不是一成不变的,因此应该不能表示为一个。
常量就像名称所暗示的那样,字段不会改变,通常在编译时在代码中静态定义。
只读变量是可以在特定条件下更改的字段。
它们可以在第一次像常量一样声明时初始化,但通常在构造函数内的对象构造期间初始化。
在上述条件下,初始化发生后不能更改它们。
静态只读对我来说听起来是一个糟糕的选择,因为如果它是静态的,并且它永远不会改变,那么就使用它public 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!