|
C#
supports two types of constructor, a class constructor (static
constructor) and an instance constructor (non-static
constructor).
Static constructor is used to initialize static
data members as soon as the class is referenced first time,
whereas an instance constructor is used to create an instance of
that class with <new> keyword. A static constructor
does not take access modifiers or have parameters and can't access
any non-static data member of a class.
Since static
constructor is a class constructor, they are guaranteed to be called
as soon as we refer to that class or by creating an instance of that
class.
You may say, why not initialize static data members
where we declare them in the code. Like this :
private static
int id = 10; private static string name = "jack";
Static
data members can certainly be initialized at the time of their
declaration but there are times when value of one static member may
depend upon the value of another static member. In such cases we
definitely need some mechanism to handle conditional initialization
of static members. To handlesuch situation, C# provides static
constructor.
Let me explain you with examples :
//File
Name : Test.cs
using System;
namespace
Constructor {
class Test { //Declaration and
initialization of static data member private static int id
= 5;
public static int Id { get { return
id; } }
public static void
print() { Console.WriteLine("Test.id = " +
id); }
static void Main(string[] args) {
//Print
the value of id Test.print(); } }
}
In
the above example, static data member <id> is declared and
initialized in same line. So if you compile and run this program
your output would look similar to this :
Test.id =
5
Lets create one more class similar to class Test but this
time the value of its static data member would depend on the value
of static data member <id> of class
Test.id.
//File Name : Test1.cs using
System;
namespace Constructor {
class
Test1 { private static int id ;
//Static constructor,
value of data member id is set conditionally here. //This
type of initialization is not possible at the time of
declaration. static Test1() { if( Test.Id < 10
) { id = 20; } else { id =
100; }
Console.WriteLine("Static<Class>
Constructor for Class Test1 Called.."); }
public static
void print() { Console.WriteLine("Test1.id = " +
id); }
static void Main(string[] args) {
//Print
the value of id Test1.print(); }
} }
As
you can see in the above static constructor, static data member
<id> is initialized conditionally. This type of initialization
is not possible at the time of declaration. This is where static
constructor comes in picture. So if you compile and run this program
your output would look similar to this :
Static<Class>
Constructor for Class Test1 Called.. id = 20
Since
<id> in class Test was initialized with a value of 5,
therefore <id> in class Test1 got initialized to a value of
20.
Some important point regarding static constructor
from C# Language Specification and C# Programmer's Reference
:
1) The static constructor for a class executes before any
instance of the class is created. 2) The static constructor for a
class executes before any of the static members for the class are
referenced. 3) The static constructor for a class executes after
the static field initializers (if any) for the class. 4) The
static constructor for a class executes at most one time during a
single program instantiation 5) A static constructor does not
take access modifiers or have parameters. 6) A static constructor
is called automatically to initialize the class before the first
instance is created or any static members are
referenced. 7) A static constructor cannot be called
directly. 8) The user has no control on when the static
constructor is executed in the program. 9) A typical use of
static constructors is when the class is using a log file and the
constructor is used to write entries to this file.
Hopefully,
this would clear the confusion some of developers have about static
constructor.
Disclaimer: The above program is
intended solely for learning purpose. Author will not be held
responsible for any failure or damages caused due to any other
usage: |