在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
常量成员是在编译时定义的,不能在运行时更改。常量使用const关键字声明为字段,并且必须在声明时进行初始化。
public class MyClass
{
public const double PI1 = 3.14159;
}
只读成员就像一个常量,因为它代表一个不变的值。不同之处在于,只读成员可以在运行时在构造函数中初始化,也可以在声明时初始化。
public class MyClass1
{
public readonly double PI2 = 3.14159;
//or
public readonly double PI3;
public MyClass2()
{
PI3 = 3.14159;
}
}
常量
它们不能声明为静态(它们是隐式静态的)常数的值在编译时计算常量仅在声明时初始化
只读的
它们可以是实例级的,也可以是静态的该值在运行时计算readonly可以在声明中初始化,也可以通过构造函数中的代码初始化
其他回答
常量
默认情况下,常量是静态的它们在编译时必须有一个值(例如3.14*2,但不能调用方法)无法在函数中声明复制到使用它们的每个程序集中(每个程序集都获得值的本地副本)可用于属性
只读实例字段
在构造函数退出时必须具有设置值在创建实例时计算
静态只读字段
当代码执行命中类引用时(当创建新实例或执行静态方法时)在完成静态构造函数时必须具有计算值不建议将ThreadStaticAttribute放在这些线程上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程将未初始化此值)
我相信常量值对于所有对象都是相同的(并且必须用文字表达式初始化),而只读对于每个实例化可以是不同的。。。
常量
const关键字可以应用于字段或局部变量我们必须在声明时指定常量字段未分配内存,因为编译后常量值嵌入IL代码本身。这就像查找所有出现的常量变量并用其值替换。因此编译后的IL代码将使用硬编码值代替常量变量默认情况下,C#中的常量是静态的。所有对象的值都是常量存在dll版本控制问题-这意味着每当我们更改公共常量变量或属性时(事实上,理论上不应该更改),任何其他使用此变量的dll或程序集都必须重新构建只有C#内置类型可以声明为常量Const字段不能作为ref或out参数传递
只读
readonly关键字仅适用于字段而非局部变量我们可以在声明时或在构造函数中分配只读字段,而不是在任何其他方法中。为只读字段分配动态内存,我们可以在运行时获得该值。只读属于创建的对象,因此只能通过类的实例访问。为了使其成为类成员,我们需要在只读之前添加静态关键字。根据使用的构造函数,值可能不同(因为它属于类的对象)如果将非基元类型(引用类型)声明为只读,则只读引用是不可变的,而不是它所包含的对象。由于该值是在运行时获得的,因此只读字段/财产不存在dll版本控制问题。我们可以在构造函数上下文中将只读字段作为ref或out参数传递。
有一个与常量的gotcha!如果从另一个程序集引用常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中发生更改!
关键区别在于Const是#DEFINE的C等价物。这个数字实际上被替换为a-la预编译器。只读实际上被视为一个变量。
当项目A依赖于项目B中的公共常数时,这种区别尤其重要。假设公共常数发生变化。现在,您选择const/readonly将影响项目A的行为:
Const:项目A不会捕获新值(当然,除非使用新的Const重新编译),因为它是使用中的子常量编译的。
ReadOnly:项目A将始终向项目B请求其变量值,因此它将获取B中公共常量的新值。
老实说,我建议您对除真正的通用常数(例如Pi、Inches_To_厘米)之外的几乎所有内容都使用只读。对于任何可能改变的内容,我建议使用只读。
希望这有帮助,艾伦。