在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
在C#中常量和只读之间有什么区别?
你什么时候会用一个代替另一个?
当前回答
何时使用常量或只读常量编译时常量:绝对常量,值在声明期间设置,在IL代码本身中只读的运行时常量:可以通过配置文件(即App.config)在构造函数/init中设置,但一旦初始化就不能更改
其他回答
有一个只读的小陷阱。只读字段可以在构造函数中设置多次。即使在两个不同的链式构造函数中设置了该值,它仍然是允许的。
public class Sample {
private readonly string ro;
public Sample() {
ro = "set";
}
public Sample(string value) : this() {
ro = value; // this works even though it was set in the no-arg ctor
}
}
它们都是常量,但在编译时也可以使用常量。这意味着差异的一个方面是,可以使用常量变量作为属性构造函数的输入,但不能使用只读变量。
例子:
public static class Text {
public const string ConstDescription = "This can be used.";
public readonly static string ReadonlyDescription = "Cannot be used.";
}
public class Foo
{
[Description(Text.ConstDescription)]
public int BarThatBuilds {
{ get; set; }
}
[Description(Text.ReadOnlyDescription)]
public int BarThatDoesNotBuild {
{ get; set; }
}
}
下面是另一个链接,演示const如何不是版本安全的,或者与引用类型无关。
摘要:
const属性的值在编译时设置,不能在运行时更改Const不能被标记为静态的-关键字表示它们是静态的,而只读字段则可以。Const不能是除值(基元)类型以外的任何类型readonly关键字将字段标记为不可更改。但是,属性可以在类的构造函数内更改readonly关键字还可以与static组合,使其以与常量相同的方式(至少在表面上)起作用。当你观察两者之间的IL时,有一个显著的差异常量字段在IL中标记为“literal”,而readonly为“initonly”
原则上;您可以在运行时将静态只读字段的值分配给非常量值,而常量必须分配给常量值。
我相信常量值对于所有对象都是相同的(并且必须用文字表达式初始化),而只读对于每个实例化可以是不同的。。。