C#常量数据与只读字段
常量数据
C#提供了const关键字来定义常量,如果我们要为应用程序定义逻辑上和某个类或结构相关的一组已知值的话,就非常有用。
假如我们创建一个MyMathClass的工具类,且需要定义一个PI值(假如是3.14),如果不希望别的开发者改变PI值,可以使用如下常量定义PI值:
class MyMathClass
{
//定义为常量数据
public const double PI=3.14;
}
class Program
{
public static void Main(string[] args)
{
//注意:因为常量数据是隐式静态的,所以直接在类级别上调用(MyMathClass.PI)。
Console.WriteLine("PI值是:{0}",MyMathClass.PI);
//错误!常量数据不能被修改。
MyMathClass.PI=3.15;
Console.ReadLine();
}
}
注意:定义常量时必须为常量指定初始值,常量一旦定义就不能修改了。
class MyMathClass
{
//尝试再构造函数中给常量赋值
public const double PI;
public MyMathClass()
{
//错误!
PI=3.14;
}
}
只读字段
和常量密切联系的概念是只读字段(不要和只读属性混淆哦,只读属性指只有get块的属性)。和常量相似,只读字段不能在赋值后改变。然而,和常量不同,赋值给只读字段可以在运行时决定。因此在构造函数作用域范围内给只读字段赋值是合法的(其他地方不行!)。
class MyMathClass
{
//可以构造函数中为只读字段赋值,其他地方不行!
public readonly double PI;
public MyMathClass()
{
PI=3.14;
}
public void ChangePI()
{
//错误!
PI=3.14;
}
}
另:只读字段不是隐式静态的,要定义静态只读字段就需要使用static关键字了。
问题:请叙述const与readonly的区别。
const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数,开心哦。const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编 译时就需要完全评估。const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作推迟到运行期进行。
readonly 关键字与 const 关键字不同: const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时 常数,而 readonly 字段可用于运行时常数。readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。