我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
如果Consumer位于不同的程序集中,我将使用静态只读。将const和Consumer放在两个不同的集合中是一个很好的方法来击中自己的脚。
其他回答
公共静态只读字段有点不寻常;公共静态财产(只有一个get)将更常见(可能由私有静态只读字段支持)。
常量值直接写入调用站点;这是双面的:
如果值是在运行时获取的,可能是从config获取的如果更改常量的值,则需要重建所有客户端但它可以更快,因为它避免了方法调用。。。…有时JIT可能会内联
如果该值永远不会改变,那么常量是好的-零等是合理的常量;p除此之外,静态财产更常见。
静态只读:
可以在运行时通过静态构造函数更改该值。但不是通过成员函数。
常量:
默认情况下为静态。值不能从任何地方(构造函数、函数、运行时等)更改。
只读:
可以在运行时通过构造函数更改该值。但不是通过成员函数。
您可以查看我的存储库:C#属性类型。
常量(在编译时确定)可用于只读静态不能使用的情况,如在switch语句或属性构造函数中。这是因为只读字段仅在运行时解析,并且某些代码构造需要编译时保证。只读静态可以在构造函数中计算,这通常是一个重要而有用的东西。区别是功能性的,我认为它们的用法也是如此。
在内存分配方面,至少对于字符串(作为引用类型)来说,似乎没有区别,因为两者都是内部的,并且将引用一个内部的实例。
就我个人而言,我的默认值是只读静态的,因为它对我来说更有语义和逻辑意义,尤其是因为大多数值在编译时都不需要。顺便说一句,公共只读静态数据并不罕见,正如标记的答案所示:例如,System.String.Empty就是其中之一。
如果Consumer位于不同的程序集中,我将使用静态只读。将const和Consumer放在两个不同的集合中是一个很好的方法来击中自己的脚。
另外一个我不相信的区别是上面提到的:
常量和静态只读值不会在Visual Studio IDE中应用CodeLens。
static只获取财产,但会将CodeLens应用于这些属性。
我认为添加CodeLens非常有价值。
注意:当前正在使用Visual Studio 2022。