(2) 初始化赋值差异。
const润饰的常量必需在声明的同时赋值。比方:
public class Class1 { public const int MaxValue = 10; //准确声明 public const MInValue; //毛病:常量字段请求供应一个值 public Class1() { MinValue = 10; } }
readonly字段可以在初始化(声明或组织函数)的过程当中赋值。因而,依据所运用的组织函数,readonly字段可以具有差异的值。
public class Class1 { public readonly int c = 10; //准确声明 public readonly int z; public Class1() { z = 24;//准确 } protected void Load() { z = 24;//毛病:没法对只读的字段赋值(组织函数或变量初始值指定项中除外) } }
readonly是实例成员,所以差异的实例可以有差异的常量值,这是readonly更天真。
public readonly Color Red = new Color(255, 0, 0); public readonly Color Green = new Color(0, 255, 0); public readonly Color Blue = new Color(0, 0, 255);
(3) const字段是编译时常数,而readonly字段可用于运行时常数。
const请求编译器可以在编译时盘算出肯定的值。在编译的时刻,用盘算出的这个肯定的值去替代挪用该常量的每个处所。因而不能从一个变量中提取值来初始化常量。
readonly许可把一个字段设置成常量,但可以实行一些运算,可以肯定它的初始值。因为readonly是在盘算时实行的,所以可以用某些变量初始化。在运行时才肯定的该值。
(4) const默许就是静态的,而readonly假如设置成静态的就必需显现声明。
(5) const润饰的值的范例也有限定,它只能为以下范例之一(或可以转换为以下范例):sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、enum范例或援用范例。注重可以声明为const的援用范例只能为string或值为null的其他援用范例。readonly可所以任何范例。
这就是说,当我们须要一个const的常量时,若他的范例限定了它不能再编译时被盘算出肯定的值来,那末我们可采用将之声明为static readonly的体式格局来处理。但两者之间照样有一点纤细的差异的。看下面两个差异的文件。
file1.cs
using System; namespace MyNamespace1 { public class MyClass1 { public static readonly int myField = 10; } }
file2.cs
namespace MyNamespace2 { public class MyClass1 { public static void Main() { Console.WriteLine(MyNamespace1.MyClass1.myField); } } }
两个类分属于两个文件file1.cs和file2.cs,并离开编译。在文件file1.cs内的域myField声明为static readonly时,假如我们因为某种须要将myField的值改为了20,那末我们只须要从新编译文件file1.cs为file1.dll,在实行file2.exe时即会获得20。
但假如将static readonly转变成const后,再转变myField的初始化值时,我们则必需从新编译一切援用到file1.dll的文件,不然我们援用的MyNamespace1.MyClass1.myField将不会如我们所愿而转变。这在大的系统开发过程当中特别须要注重。
(6) object、Array(数组)和struct(构造)不能被声明为const常量。
以上就是c#.net中const和readonly的区分的内容,更多相关内容请关注ki4网(www.ki4.cn)!