在C#中常量和只读之间有什么区别?

你什么时候会用一个代替另一个?


当前回答

又一次抓住了。由于const实际上只适用于基本数据类型,如果您想使用类,您可能会感到“被迫”使用ReadOnly。然而,当心陷阱!ReadOnly表示不能用其他对象替换对象(不能使其引用其他对象)。但是任何引用对象的进程都可以自由修改对象内的值!因此,不要困惑地认为ReadOnly意味着用户无法更改内容。C#中没有简单的语法可以防止类的实例化更改其内部值(据我所知)。

其他回答

ReadOnly:该值只能从类的构造函数初始化一次。const:可以在任何函数中初始化,但只能初始化一次

有一个与常量的gotcha!如果从另一个程序集引用常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中发生更改!

原则上;您可以在运行时将静态只读字段的值分配给非常量值,而常量必须分配给常量值。

不同之处在于,静态只读字段的值是在运行时设置的,因此对于程序的不同执行,它可以具有不同的值。但是,const字段的值设置为编译时常量。

记得:对于引用类型,在这两种情况下(静态和实例),只读修饰符只会阻止您将新引用分配给字段。它特别地不使引用指向的对象不可变。

有关详细信息,请参阅有关此主题的C#常见问题解答:http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx

常量

默认情况下,常量是静态的它们在编译时必须有一个值(例如3.14*2,但不能调用方法)无法在函数中声明复制到使用它们的每个程序集中(每个程序集都获得值的本地副本)可用于属性

只读实例字段

在构造函数退出时必须具有设置值在创建实例时计算

静态只读字段

当代码执行命中类引用时(当创建新实例或执行静态方法时)在完成静态构造函数时必须具有计算值不建议将ThreadStaticAttribute放在这些线程上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程将未初始化此值)