I\'ve read around about const
and static readonly
fields. We have some classes which contain only constant values. They are used for various things
Const: Const is nothing but "constant", a variable of which the value is constant but at compile time. And it's mandatory to assign a value to it. By default a const is static and we cannot change the value of a const variable throughout the entire program.
Static ReadOnly: A Static Readonly type variable's value can be assigned at runtime or assigned at compile time and changed at runtime. But this variable's value can only be changed in the static constructor. And cannot be changed further. It can change only once at runtime
Reference: c-sharpcorner
One thing to note is const is restricted to primitive/value types (the exception being strings).
Static Read Only:
The value can be changed through a static
constructor at runtime. But not through a member function.
Constant:
By default static
. A value cannot be changed from anywhere (constructor, function, runtime, etc. nowhere).
Read Only:
The value can be changed through a constructor at runtime. But not through a member function.
You can have a look at my repository: C# property types.
Const: Constant variable values have to be defined along with the declaration and after that it won't change.const are implicitly static, so without creating a class instance we can access them. This has a value at compile time.
ReadOnly: We can define read-only variable values while declaring as well as using the constructor at runtime. Read-only variables can't access without a class instance.
Static readonly: We can define static readonly variable values while declaring as well as only through a static constructor, but not with any other constructor. We can also access these variables without creating a class instance (as static variables).
Static readonly will be better choice if we have to consume the variables in different assemblies. Please check the full details in the below blog post:
Const Strings – a very convenient way to shoot yourself in the foot
This is just a supplement to the other answers. I will not repeat them (now four years later).
There are situations where a const
and a non-const have different semantics. For example:
const int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
prints out True
, whereas:
static readonly int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
writes False
.
The reason is that the method x.Equals has two overloads, one that takes in a short
(System.Int16
) and one that takes an object
(System.Object
). Now the question is whether one or both apply with my y
argument.
When y
is a compile-time constant (literal), the const
case, it becomes important that there does exist an implicit conversion from int
to short
provided that the int
is a constant, and provided that the C# compiler verifies that its value is within the range of a short
(which 42
is). See Implicit constant expression conversions in the C# Language Specification. So both overloads have to be considered. The overload Equals(short)
is preferred (any short
is an object
, but not all object
are short
). So y
is converted to short
, and that overload is used. Then Equals
compares two short
of identical value, and that gives true
.
When y
is not a constant, no implicit conversion from int
to short
exists. That's because in general an int
may be too huge to fit into a short
. (An explicit conversion does exist, but I didn't say Equals((short)y)
, so that's not relevant.) We see that only one overload applies, the Equals(object)
one. So y
is boxed to object
. Then Equals
is going to compare a System.Int16
to a System.Int32
, and since the run-time types do not even agree, that will yield false
.
We conclude that in some (rare) cases, changing a const
type member to a static readonly
field (or the other way, when that is possible) can change the behavior of the program.
const:
readonly: