What is the difference between const and readonly in C#?

.net, c#, constants, readonly

Solution

Apart from the apparent difference of

- having to declare the value at the time of a definition for a `const` VS `readonly` values can be computed dynamically but need to be assigned before the constructor exits. After that it is frozen.

- `const`'s are implicitly `static`. You use a `ClassName.ConstantName` notation to access them.

There is a subtle difference. Consider a class defined in `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` references `AssemblyA` and uses these values in code. When this is compiled:

- in the case of the `const` value, it is like a find-replace. The value 2 is 'baked into' the `AssemblyB`'s IL. This means that if tomorrow I update `I_CONST_VALUE` to 20, `AssemblyB` would still have 2 till I recompile it.

- in the case of the `readonly` value, it is like a `ref` to a memory location. The value is not baked into `AssemblyB`'s IL. This means that if the memory location is updated, `AssemblyB` gets the new value without recompilation. So if `I_RO_VALUE` is updated to 30, you only need to build `AssemblyA` and all clients do not need to be recompiled.

So if you are confident that the value of the constant won't change, use a `const`.

public const int CM_IN_A_METER = 100;

But if you have a constant that may change (e.g. w.r.t. precision) or when in doubt, use a `readonly`.

public readonly float PI = 3.14;

Update: Aku needs to get a mention because he pointed this out first. Also I need to plug where I learned this: Effective C# - Bill Wagner

Problem

What is the difference between `const` and `readonly` in C#? When would you use one over the other?

Original source

Related problems