在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
const是编译时常量,而readonly允许在运行时计算值并在构造函数或字段初始值设定项中设置。因此,“const”总是常量,但“readonly”在赋值后是只读的。
C#团队的埃里克·里佩尔(Eric Lippert)有更多关于不同类型不变性的信息。
其他回答
常量必须是硬编码的,其中可以在类的构造函数中设置为只读。
有一个与常量的gotcha!如果从另一个程序集引用常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中发生更改!
不同之处在于,静态只读字段的值是在运行时设置的,因此对于程序的不同执行,它可以具有不同的值。但是,const字段的值设置为编译时常量。
记得:对于引用类型,在这两种情况下(静态和实例),只读修饰符只会阻止您将新引用分配给字段。它特别地不使引用指向的对象不可变。
有关详细信息,请参阅有关此主题的C#常见问题解答:http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx
关键区别在于Const是#DEFINE的C等价物。这个数字实际上被替换为a-la预编译器。只读实际上被视为一个变量。
当项目A依赖于项目B中的公共常数时,这种区别尤其重要。假设公共常数发生变化。现在,您选择const/readonly将影响项目A的行为:
Const:项目A不会捕获新值(当然,除非使用新的Const重新编译),因为它是使用中的子常量编译的。
ReadOnly:项目A将始终向项目B请求其变量值,因此它将获取B中公共常量的新值。
老实说,我建议您对除真正的通用常数(例如Pi、Inches_To_厘米)之外的几乎所有内容都使用只读。对于任何可能改变的内容,我建议使用只读。
希望这有帮助,艾伦。
又一次抓住了。由于const实际上只适用于基本数据类型,如果您想使用类,您可能会感到“被迫”使用ReadOnly。然而,当心陷阱!ReadOnly表示不能用其他对象替换对象(不能使其引用其他对象)。但是任何引用对象的进程都可以自由修改对象内的值!因此,不要困惑地认为ReadOnly意味着用户无法更改内容。C#中没有简单的语法可以防止类的实例化更改其内部值(据我所知)。