const和readonly有什么区别?

constreadonly之间有什么区别,你使用一个吗?


除了明显的区别之外

  • 必须在定义const时声明值VS readonly值可以动态计算,但需要在构造函数退出之前分配..在此之后它被冻结。
  • 'const'是隐式static 。 您使用ClassName.ConstantName表示法来访问它们。
  • 有一个微妙的区别。 考虑一下AssemblyA定义的类。

    public class Const_V_Readonly
    {
      public const int I_CONST_VALUE = 2;
      public readonly int I_RO_VALUE;
      public Const_V_Readonly()
      {
         I_RO_VALUE = 3;
      }
    }
    

    AssemblyB引用AssemblyA并在代码中使用这些值。 当这被编译时,

  • const值的情况下,它就像一个查找替换,值2被“烘焙”到AssemblyB的IL中。 这意味着如果明天我将来会将I_CONST_VALUE更新为20。 AssemblyB将仍然有2直到我重新编译它。
  • readonly值的情况下,它就像是一个内存位置的ref 。 这个价值不会被汇集到AssemblyB的IL中。 这意味着如果内存位置更新, AssemblyB将获得新的值而不需要重新编译。 因此,如果I_RO_VALUE更新为30,则只需构建AssemblyA 。 所有客户端不需要重新编译。
  • 所以如果你确信常量的值不会改变,就使用const

    public const int CM_IN_A_METER = 100;
    

    但是,如果你有一个常数可能会改变(例如精度),或者有疑问时,使用readonly

    public readonly float PI = 3.14;
    

    更新:阿库需要提一提,他首先指出了这一点。 此外,我需要插入的地方,我了解到这一点..有效的C# - 比尔瓦格纳


    与consts有一个陷阱! 如果您从另一个程序集中引用常量,则其值将被编译到调用程序集中。 这样,当你更新引用程序集中的常量时,它在调用程序集中不会改变!


    常量

  • 常量默认是静态的
  • 它们在编译时必须有一个值(你可以有例如3.14 * 2,但不能调用方法)
  • 可以在函数中声明
  • 被复制到每个使用它们的程序集中(每个程序集都获得一个值的本地副本)
  • 可以在属性中使用
  • 只读实例字段

  • 在构造函数退出时,必须具有设定值
  • 在创建实例时进行评估
  • 静态只读字段

  • 在代码执行遇到类引用时进行评估(当创建新实例或执行静态方法时)
  • 在静态构造函数完成时,必须有一个评估值
  • 不建议将ThreadStaticAttribute放置在这些静态构造函数上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程都将此值初始化)
  • 链接地址: http://www.djcxy.com/p/477.html

    上一篇: What is the difference between const and readonly?

    下一篇: sizeof(int) on x64?