Readonly , Const & Static Readonly

I am not here mentioning any new thing , just orgainising this; is one of the most frequently asked questions for entry level .net programmers/developers

Const :

1 A Const variable value is initialized at Compile time and Cant be changed afterwards once value is assigned.

2 A Const variable is initiailized at declaration only cant be changed once initialised.

3 It is to be said that Const variable/member is considered as Static by compiler at time of compilation. but Const cant be declared as static.

4 Constants must be of an integral type (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, or string), an enumeration,   or a  reference to null.

5  Const cant be of type class / structure bcoz both are initialized at runtime ( with new keyword ) & const expected to assign value at compile time.

e.g.

public class MyClass

{

public const double e = 2.71828;  // Need to assign value at the time of declaration.

}

To use a constant outside of the class that it is declared in, you must fully qualify it using the class name.

*****************************************************************************************************************

Readonly :

1 A Readonly variable can be either instance-level or static.

2 A Readonly variable value is initialized at run time and Cant be changed afterwards once value is assigned.

3 A Readonly variable can be initialized at declaration or by code in the constructor, Can have different values depending upon which constructor is getting  called.(Also variable can be modified/initialized at Static Instructor if Variable is static readonly.)

4 A Readonly members cannot be of type enumerations.

e.g.

public class MyClass

{

public readonly double e = 2.71828;

}

OR

public class MyClass

{

public readonly double e; // Can use Default value ,initialization at the runtime.

public MyClass()

{

e = 2.71828;

}

}

The readonly field can be used for runtime constants as in the following example:

public static readonly uint l1 = (uint)DateTime.Now.Ticks;


REF Details : Readonly &   Static

*****************************************************************************************************************

Static Readonly:

1 We can create ‘static readonly’ member when we want member to be accessed without need to create instance of the class.

2 static readonly is generally used if the type of the field is not allowed in a const declaration, or when the value is not  known at compile t ime.

3 For static readonly member we can modify/initialize at Static Instructor.

Note :

1.  I would like to borrow an examples from MSDN Blogs

Remember that for reference types, in both cases (static and instance) the readonly modifier only prevents you from assigning a new reference to the field.  It specifically does not make immutable the object pointed to by the reference.

class Program

{

public static readonly Test test = new Test();

static void Main(string[] args)

{

test.Name = “Program”;

test = new Test();  // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

}

}

class Test

{

public string Name;

}

On the other hand, if Test were a value type, then assignment to test.Name would be an error.

2. If the readonly member is of type int then.

class Test

{

readonly int testValue;

readonly int testnew = 12;

Test(int TestValue)

{

testValue = TestValue;

}

void ChangeYear()

{

testValue = 10; // Will get compile time error.

testnew = 23; // Will get compile time error.

}

}

we  will get the compiler error message:  “The left-hand side of an assignment must be an l-value”

We will get the same error when we try to assign a value to a constant.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s