在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
常量
默认情况下,常量是静态的它们在编译时必须有一个值(例如3.14*2,但不能调用方法)无法在函数中声明复制到使用它们的每个程序集中(每个程序集都获得值的本地副本)可用于属性
只读实例字段
在构造函数退出时必须具有设置值在创建实例时计算
静态只读字段
当代码执行命中类引用时(当创建新实例或执行静态方法时)在完成静态构造函数时必须具有计算值不建议将ThreadStaticAttribute放在这些线程上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程将未初始化此值)
其他回答
常量
默认情况下,常量是静态的它们在编译时必须有一个值(例如3.14*2,但不能调用方法)无法在函数中声明复制到使用它们的每个程序集中(每个程序集都获得值的本地副本)可用于属性
只读实例字段
在构造函数退出时必须具有设置值在创建实例时计算
静态只读字段
当代码执行命中类引用时(当创建新实例或执行静态方法时)在完成静态构造函数时必须具有计算值不建议将ThreadStaticAttribute放在这些线程上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程将未初始化此值)
Const:应用程序生命周期内的绝对常量值。
只读:可以在运行时更改。
有一个只读的小陷阱。只读字段可以在构造函数中设置多次。即使在两个不同的链式构造函数中设置了该值,它仍然是允许的。
public class Sample {
private readonly string ro;
public Sample() {
ro = "set";
}
public Sample(string value) : this() {
ro = value; // this works even though it was set in the no-arg ctor
}
}
常量必须是硬编码的,其中可以在类的构造函数中设置为只读。
const是编译时常量,而readonly允许在运行时计算值并在构造函数或字段初始值设定项中设置。因此,“const”总是常量,但“readonly”在赋值后是只读的。
C#团队的埃里克·里佩尔(Eric Lippert)有更多关于不同类型不变性的信息。