const,readonly字段的取舍!

如果想在类中定义某些常量字段,一般有两种选择,可以定义成const,也可以定义成readonly,这两种方式如何取舍呢?

在绝大多数情况下,readonly是要优于const的,因为readonly可以带来更大的灵活性!一般我们可以认为const是编译时常量,也就是说你引用const字段,在编译的时候就被替换成相应的常量值了!

例如:

public class MyClass

{

      public const int Count=0;

}

static void Main(string[] args)

{

     int i=MyClass.Count ;

}

在编译器看来,Main方法实际上相当于这样:

static void Main(string[] args)

{

     int i=0;

}

而readonly字段刚好和const字段相反,我们可以认为他是运行时常量,也就是说你引用readonly字段,他的值是运行时确定的,这样就带来了很大的灵活性

而const有时可能会破坏二进制的兼容性,看我们刚才那个例子,比如你的MyClass是定义在另外一个dll中而当前的项目是引用这个dll的,这到是没有什么问题!但是将来需求突然改变了,如果count需要赋值为100了,这样你不得不修改代码,发布一个dll的新版本!由于const字段是编译时常量,所有引用这个字段的代码在编译的时候就已经被替换为相应的值了(值是0),这样带来的问题是所有引用这个字段的程序集都需要重新编译才能正确运行,这样就破坏了二进制的兼容性!

而使用readonly字段就可以避免这个问题,因为所有引用readonly字段的代码编译的时候并没有被替换成字段的值!

那const是不是没有任何的优点了呢?

实际上编译时常量在效率上是优于运行时常量的,但是差别并不是很大 !

只有你真正的确定这个字段的值永远都不会变了,这时才使用const,这时可以获得有限的性能改善!

否则,最好使用readonly字段!

原文地址:https://www.cnblogs.com/xuefeng1982/p/1505263.html