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#设计者们的良苦用心。 

 

posted on 2017-04-12 15:43  米斯特CHEN  阅读(139)  评论(0编辑  收藏  举报