我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
如果可以提供编译时间常数,请使用const:
private const int Total = 5;
如果需要在运行时计算值,请使用静态只读:
private static readonly int GripKey = Animator.StringToHash("Grip");
这将导致编译错误,因为在编译时不可能获得该值。
private const int GripKey = Animator.StringToHash("Grip");
其他回答
静态只读字段在暴露于其他程序集的值可能会在更高版本中更改。
例如,假设程序集X公开一个常量,如下所示:
public const decimal ProgramVersion = 2.3;
如果程序集Y引用X并使用该常量,则值2.3编译时将烘焙到程序集Y中。这意味着如果稍后重新编译X并将常量设置为2.4,则Y仍将使用旧值2.3直到重新编译Y。静态只读字段避免了这个问题。
另一种看待这一点的方式是根据定义,未来的变化不是一成不变的,因此应该不能表示为一个。
如果可以提供编译时间常数,请使用const:
private const int Total = 5;
如果需要在运行时计算值,请使用静态只读:
private static readonly int GripKey = Animator.StringToHash("Grip");
这将导致编译错误,因为在编译时不可能获得该值。
private const int GripKey = Animator.StringToHash("Grip");
常量就像名称所暗示的那样,字段不会改变,通常在编译时在代码中静态定义。
只读变量是可以在特定条件下更改的字段。
它们可以在第一次像常量一样声明时初始化,但通常在构造函数内的对象构造期间初始化。
在上述条件下,初始化发生后不能更改它们。
静态只读对我来说听起来是一个糟糕的选择,因为如果它是静态的,并且它永远不会改变,那么就使用它public const。如果它可以改变,那么它不是常量,然后根据您的需要,您可以使用只读变量,也可以仅使用常规变量。
另外,另一个重要区别是常量属于类,而只读变量属于实例!
另外一个我不相信的区别是上面提到的:
常量和静态只读值不会在Visual Studio IDE中应用CodeLens。
static只获取财产,但会将CodeLens应用于这些属性。
我认为添加CodeLens非常有价值。
注意:当前正在使用Visual Studio 2022。
如果Consumer位于不同的程序集中,我将使用静态只读。将const和Consumer放在两个不同的集合中是一个很好的方法来击中自己的脚。