C# has two different kinds of constructors, static and instance – depending on whether they are declared with the static keyword or not. While C# instance constructors are similar to Java constructors, C#'s static constructors are similar to Java static initializers. Static constructors, like their instance counterparts, must have the same name and case as the class of which it is a member.
However, unlike instance constructors, static constructors:
cannot have parameters;
cannot have accessibility modifiers;
cannot be called explicitly.
Static constructors are automatically invoked before the first static class member is utilized. Here is an example of a static constructor.
1: using System; 2: 3: public class Test{ 4: private static string StaticField; 5: 6: public static void Main(){ 7: Console.WriteLine(Test.StaticField); 8: } 9: 10: // static constructor 11: static Test(){ 12: StaticField = "i am initialized"; 13: Console.WriteLine("running static constructor"); 14: } 15: }
Output:
c:expt>test running static constructor i am initialized
In the example above, even if lines 4 and 12 are commented out, the output still indicates that the static constructor has executed (output shows 'running static constructor'). The reason? [6] Well, because Main itself is static, and is considered to be a static member. When Main runs, the static constructor of the class of which it is a member needs to run first.
[6] This is a trick question!
A static constructor is executed before an instance constructor when a new instance of the class is created, regardless of whether the class has any static member or not. The following example demonstrates this.
1: using System; 2: 3: class Test{ 4: public static void Main(){ 5: Demo d = new Demo(); 6: } 7: } 8: 9: class Demo{ 10: // static constructor 11: static Demo(){ 12: Console.WriteLine("running static constructor"); 13: } 14: // instance constructor 15: public Demo(){ 16: Console.WriteLine("running instance constructor"); 17: } 18: }
Output:
c:expt>test running static constructor running instance constructor
Both Java static initializers and C# static constructors cannot be called explicitly. Both do not take in parameters, and overloading doesn't make sense in both cases.
The difference between a Java static initializer and a C# static constructor is that you can have multiple static initializers in a Java class which will be executed in order. You can have only one static constructor in any C# class.
Other differences are largely syntactical.
18.191.205.99