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

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

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


当前回答

常量就像名称所暗示的那样,字段不会改变,通常在编译时在代码中静态定义。

只读变量是可以在特定条件下更改的字段。

它们可以在第一次像常量一样声明时初始化,但通常在构造函数内的对象构造期间初始化。

在上述条件下,初始化发生后不能更改它们。

静态只读对我来说听起来是一个糟糕的选择,因为如果它是静态的,并且它永远不会改变,那么就使用它public const。如果它可以改变,那么它不是常量,然后根据您的需要,您可以使用只读变量,也可以仅使用常规变量。

另外,另一个重要区别是常量属于类,而只读变量属于实例!

其他回答

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

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

常量就像名称所暗示的那样,字段不会改变,通常在编译时在代码中静态定义。

只读变量是可以在特定条件下更改的字段。

它们可以在第一次像常量一样声明时初始化,但通常在构造函数内的对象构造期间初始化。

在上述条件下,初始化发生后不能更改它们。

静态只读对我来说听起来是一个糟糕的选择,因为如果它是静态的,并且它永远不会改变,那么就使用它public const。如果它可以改变,那么它不是常量,然后根据您的需要,您可以使用只读变量,也可以仅使用常规变量。

另外,另一个重要区别是常量属于类,而只读变量属于实例!

静态只读:

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

常量:

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

只读:

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

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

需要注意的一点是const仅限于基元/值类型(字符串除外)。

如果可以提供编译时间常数,请使用const:

private const int Total = 5;

如果需要在运行时计算值,请使用静态只读:

private static readonly int GripKey = Animator.StringToHash("Grip");

这将导致编译错误,因为在编译时不可能获得该值。

private const int GripKey = Animator.StringToHash("Grip");