const
和 readonly
在 C# 中有什么区别?
在什么情况下会使用其中一个而不是另一个?
只读: 值可以在运行时通过 Ctor 更改。但不能通过成员函数进行更改。
常量: 默认为静态。无论是在 Ctor、函数还是运行时,值都无法从任何地方更改。
还有一个需要注意的地方:只读(readonly)变量可以通过反射机制被“狡猾”的代码更改。
var fi = this.GetType()
.BaseType
.GetField("_someField",
BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);
const
值对于所有的对象都是相同的(必须使用字面表达式进行初始化),而readonly
则可以针对每个实例不同...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
或readonly
const
readonly
App.config
)设置,但一旦初始化后就无法更改另外,const变量本质上是静态的,而readonly变量则可以根据需要是实例特定的。
在C#.Net中,const字段和readonly字段之间有明显的区别。
const默认为静态字段,并且需要使用常量值进行初始化,以后无法修改该值。构造函数中也不允许更改此值。它不能与所有数据类型一起使用。例如DateTime。不能与DateTime数据类型一起使用。
public const DateTime dt = DateTime.Today; //throws compilation error
public const string Name = string.Empty; //throws compilation error
public readonly string Name = string.Empty; //No error, legal
readonly可以被声明为静态的,但不是必需的。在声明时无需初始化。其值可以通过构造函数分配或更改。因此,当用作实例类成员时,它具有优势。两个不同的实例化可能具有不同的readonly字段值。例如 -
class A
{
public readonly int Id;
public A(int i)
{
Id = i;
}
}
只读字段可以使用以下方式初始化为特定的值:
A objOne = new A(5);
A objTwo = new A(10);
在这里,实例objOne将具有只读字段的值为5,而objTwo的值为10。这是使用const不可能实现的。
const
必须是硬编码的,而 readonly
可以在类的构造函数中设置。