在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
我相信常量值对于所有对象都是相同的(并且必须用文字表达式初始化),而只读对于每个实例化可以是不同的。。。
其他回答
又一次抓住了。由于const实际上只适用于基本数据类型,如果您想使用类,您可能会感到“被迫”使用ReadOnly。然而,当心陷阱!ReadOnly表示不能用其他对象替换对象(不能使其引用其他对象)。但是任何引用对象的进程都可以自由修改对象内的值!因此,不要困惑地认为ReadOnly意味着用户无法更改内容。C#中没有简单的语法可以防止类的实例化更改其内部值(据我所知)。
常量
默认情况下,常量是静态的它们在编译时必须有一个值(例如3.14*2,但不能调用方法)无法在函数中声明复制到使用它们的每个程序集中(每个程序集都获得值的本地副本)可用于属性
只读实例字段
在构造函数退出时必须具有设置值在创建实例时计算
静态只读字段
当代码执行命中类引用时(当创建新实例或执行静态方法时)在完成静态构造函数时必须具有计算值不建议将ThreadStaticAttribute放在这些线程上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程将未初始化此值)
原则上;您可以在运行时将静态只读字段的值分配给非常量值,而常量必须分配给常量值。
还有一个陷阱:只读值可以通过反射被“狡猾”的代码改变。
var fi = this.GetType()
.BaseType
.GetField("_someField",
BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);
我可以使用反射更改C#中的私有只读继承字段吗?
常量:无法在任何地方更改。
只读:此值只能在构造函数中更改。无法在正常功能中更改。