在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
关键区别在于Const是#DEFINE的C等价物。这个数字实际上被替换为a-la预编译器。只读实际上被视为一个变量。
当项目A依赖于项目B中的公共常数时,这种区别尤其重要。假设公共常数发生变化。现在,您选择const/readonly将影响项目A的行为:
Const:项目A不会捕获新值(当然,除非使用新的Const重新编译),因为它是使用中的子常量编译的。
ReadOnly:项目A将始终向项目B请求其变量值,因此它将获取B中公共常量的新值。
老实说,我建议您对除真正的通用常数(例如Pi、Inches_To_厘米)之外的几乎所有内容都使用只读。对于任何可能改变的内容,我建议使用只读。
希望这有帮助,艾伦。
其他回答
const是编译时常量,而readonly允许在运行时计算值并在构造函数或字段初始值设定项中设置。因此,“const”总是常量,但“readonly”在赋值后是只读的。
C#团队的埃里克·里佩尔(Eric Lippert)有更多关于不同类型不变性的信息。
ReadOnly:该值只能从类的构造函数初始化一次。const:可以在任何函数中初始化,但只能初始化一次
只读:可以在运行时通过Ctor更改值。但不通过成员函数
常量:默认情况下为静态。值不能从任何位置更改(Ctor、Function、runtime等no where)
不同之处在于,静态只读字段的值是在运行时设置的,因此对于程序的不同执行,它可以具有不同的值。但是,const字段的值设置为编译时常量。
记得:对于引用类型,在这两种情况下(静态和实例),只读修饰符只会阻止您将新引用分配给字段。它特别地不使引用指向的对象不可变。
有关详细信息,请参阅有关此主题的C#常见问题解答:http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx
只读字段的值可以更改。但是,常量字段的值不能更改。
在只读字段中,我们可以在声明时或在该类的构造函数中赋值。如果是常量,我们只能在声明时赋值。
只读可以与静态修饰符一起使用,但常量不能与静态一起使用。