我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
我已经了解了常量和静态只读字段。我们有一些类只包含常量值。它们用于我们系统中的各种事情。所以我想知道我的观察是否正确:
对于所有公开的内容,这些常量值是否总是静态只读的?并且只对内部/受保护/私有值使用const?
你有什么建议?我甚至应该不使用静态只读字段,而应该使用财产吗?
当前回答
施工
只能应用于字段。值应在代码编译时。适合在编译代码之前就已经知道的代码中删除神奇的“字符串”、“int/double”、(原始类型)等。编译后,该值将被放置在编译代码的所有使用常量的地方。所以,如果你在很多地方使用了一个巨大的字符串,那么在使它成为常量之前要小心。考虑使用静态只读。
静态只读
静态只读应用于字段/道具,静态可用于方法。(附带说明)当静态应用于方法时,编译的代码不会将“this”参数传递给方法,因此您无法访问对象的实例数据。适用于编译代码后可能更改的值。类似于在应用程序启动等过程中从配置初始化的值。编译代码后,在IL代码中使用ref to值,与使用const相比可能会慢一些,但编译的代码很小
在重构过程中,所有常量都可以安全地转换为静态只读,但反之亦然,正如我们前面所看到的,当一些静态只读变量可以在构造函数中初始化时,转换后的代码可能会中断。
其他回答
Const:Const只是“常量”,它的值是常量,但在编译时是常量。并且必须为其赋值。默认情况下,常量是静态的,我们不能在整个程序中更改常量变量的值。静态只读:静态只读类型变量的值可以在运行时赋值,也可以在编译时赋值,并在运行时更改。但该变量的值只能在静态构造函数中更改。并且不能进一步改变。它只能在运行时更改一次
参考:c-sharpcorner
如果Consumer位于不同的程序集中,我将使用静态只读。将const和Consumer放在两个不同的集合中是一个很好的方法来击中自己的脚。
声明常量和静态只读之间的另一个区别在于内存分配。
静态字段属于对象的类型,而不是该类型的实例。因此,一旦类第一次被引用,静态字段将在剩余时间内“驻留”在内存中,并且静态字段的同一实例将被该类型的所有实例引用。
另一方面,常量字段“属于该类型的实例。
如果释放的内存对您来说更重要,请使用const。如果是速度,则使用静态只读。
静态只读字段在暴露于其他程序集的值可能会在更高版本中更改。
例如,假设程序集X公开一个常量,如下所示:
public const decimal ProgramVersion = 2.3;
如果程序集Y引用X并使用该常量,则值2.3编译时将烘焙到程序集Y中。这意味着如果稍后重新编译X并将常量设置为2.4,则Y仍将使用旧值2.3直到重新编译Y。静态只读字段避免了这个问题。
另一种看待这一点的方式是根据定义,未来的变化不是一成不变的,因此应该不能表示为一个。
readonly关键字与const关键字不同。常量字段只能在字段声明处初始化。只读字段可以在声明或构造函数中初始化。因此,只读字段可以具有不同的值,具体取决于所使用的构造函数。此外,虽然const字段是编译时常量,但只读字段可以用于运行时常量
从这个简短而清晰的MSDN参考中。