我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用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");