7.4. Static constructors (Java static initializers)

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

Like Java

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.

Unlike Java

  • 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.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.144.1.211