Within a class,
modifiers.const
, static
and readonly
members are special in comparison to the other
const
vs. readonly
const
and readonly
perform a similar function on data members, but they have a few important differences.
const
A constant member is defined at compile time and cannot be changed at runtime. Constants are declared as a field, using the
const
keyword and must be initialized as they are declared. For example;public class MyClass
{
public const double PI = 3.14159;
}
PI
cannot be changed in the application anywhere else in the code as this will cause a compiler error.
Constants must be a value type (
sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
, float
, double
, decimal
, or bool
), an enumeration, a string literal, or a reference to null
.
Since classes or structures are initialized at run time with the
new
keyword, and not at compile time, you can't set a constant to a class or structure.
Constants can be marked as
public
, private
, protected
, internal
, or protected internal
.
Constants are accessed as if they were static fields, although they cannot use the
static
keyword.
To use a constant outside of the class that it is declared in, you must fully qualify it using the class name.
readonly
A read only member is like a constant in that it represents an unchanging value. The difference is that a
readonly
member can be initialized at runtime, in a constructor as well being able to be initialized as they are declared. For example: public class MyClass
{
public readonly double PI = 3.14159;
}
or
public class MyClass
{
public readonly double PI;
public MyClass()
{
PI = 3.14159;
}
}
Because a
readonly
field can be initialized either at the declaration or in a constructor, readonly
fields can have different values depending on the constructor used. Areadonly
field can also be used for runtime constants as in the following example:public static readonly uint l1 = (uint)DateTime.Now.Ticks;
Notes
readonly
members are not implicitlystatic
, and therefore thestatic
keyword can be applied to areadonly
field explicitly if required.
- A
readonly
member can hold a complex object by using thenew
keyword at initialization.
static
Use of the
static
modifier to declare a static
member, means that the member is no longer tied to a specific object. This means that the member can be accessed without creating an instance of the class. Only one copy of static
fields and events exists, and static
methods and properties can only access static
fields andstatic
events. For example:public class Car
{
public static int NumberOfWheels = 4;
}
The
static
modifier can be used with classes, fields, methods, properties, operators, events and constructors, but cannot be used with indexers, destructors, or types other than classes.static
members are initialized before the static
member is accessed for the first time, and before the static
constructor, if any is called. To access a static
class member, use the name of the class instead of a variable name to specify the location of the member. For example:int i = Car.NumberOfWheels;