C# 中 const 与 readonly 的区别
const:
1、const修饰的常量必须在声明的同时赋值,而且要求编译器能够在编译时期计算出这个确定的值。
2、const修饰的常量为静态变量,不能够为对象所获取。
3、const修饰的值的类型也有限制,它只能为下列类型之一(或能够转换为下列类型的):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum类型, 或引用类型。值得注意的是这里的引用类型,由于除去string类型外,所有的类型出去null值以外在编译时期都不能由编译器计算出他们的确切的值,所以我们能够声明为const的引用类型只能为string或值为null的其他引用类型。但是声明一个为null的类型貌似没有意义(显得有点尴尬)。
readonly:
1、只能在初始化、声明初始化或构造器初始化的过程中赋值,其他地方不能进行对只读域的赋值操作,否则编译器会报错。
2、可以是实例域也可以是静态域
3、只读域的类型可以是C#语言的任何类型
Example:
using System;
namespace MyNamespace_A
{
public class MyClass_A
{
public static readonly int myField_A = 10;
}
}
using System;
namespace MyNamespace_B
{
public class MyClass_B
{
public static void Main()
{
Console.WriteLine(MyNamespace_A.MyClass_a.myField_A);
}
}
}
我们的两个类分属于两个文件file_A.cs 和file_B.cs,并分开编译。在文件file_A.cs内的域myField_A声明为static readonly时,如果我们由于某种需要改变了myField_A的值为20,我们只需重新编译文件file_A.cs为file_A.dll,在执行 file_B.exe时我们会得到20。但如果我们将static readonly改变为const后,再改变myField_A的初始化值时,我们必须重新编译所有引用到file_A.dll的文件,否则我们引用的 MyNamespace_A.MyClass_A.myField_A将不会如我们所愿而改变。这在大的系统开发过程中尤其需要注意。实际上,如果我们能够理解 const修饰的常量是在编译时便被计算出确定的值,并代换到引用该常量的每一个地方,而readonly则在运行时才确定的量。如果我们只是在初始化后便不希望它的值再改变,我们便能理解C#设计者们的良苦用心。