Konstruktor, który może zainicjować wszystkie wartości statycznych danych klasy. Nie przyjmuje on żadnych parametrów i nie ma określonego modyfikatora dostępu.
Przykład:
class SimpleClass
{
public static int Instances { get; private set; }
static SimpleClass()
{
Console.WriteLine("SimpleClass static constructor called");
Instances = 0;
}
public SimpleClass()
{
Console.WriteLine("SimpleClass object constructor called");
Instances++;
}
public int InstanceId { get { return Instances; } }
}
Przykład wywołania:
static void Main(string[] args)
{
do
{
SimpleClass s = new SimpleClass();
Console.WriteLine($"SimpleClass object instance id: {s.InstanceId}");
}
while (SimpleClass.Instances < 10);
Console.ReadLine();
}
Rezultat:
SimpleClass static constructor called SimpleClass object constructor called SimpleClass object instance id: 1 SimpleClass object constructor called SimpleClass object instance id: 2 ... SimpleClass object constructor called SimpleClass object instance id: 9 SimpleClass object constructor called SimpleClass object instance id: 10
Jak widzimy, konstruktor statyczny został wywołany na samym początku, przed inicjalizacją obiektów. Wywoływany jest przed wszystkimi konstruktorami tworzącymi nowy obiekt. Wywoływany jest tylko raz, niezależnie od ilości tworzonych obiektów.
Konstruktor statyczny wywoływany jest podczas tworzenia pierwszej instancji klasy i przed pierwszym użyciem składowej statycznej. Wyjątkiem jest obiekt statyczny tworzony w ramach deklaracji składowej.
class SimpleClass
{
public static int Instances { get; private set; }
public static ComponentClass ComponentA;
public static ComponentClass ComponentB = new ComponentClass("B");
static SimpleClass()
{
Console.WriteLine("SimpleClass static constructor called");
ComponentA = new ComponentClass("A");
Instances = 0;
}
public SimpleClass()
{
Console.WriteLine("SimpleClass object constructor called");
Instances++;
}
public int InstanceId { get { return Instances; } }
}
class ComponentClass
{
public ComponentClass(string label)
{
Console.WriteLine($"ComponentClass {label} object constructor called");
Item = 5;
Label = label;
}
public int Item;
public string Label { get; set; }
public override string ToString()
{
return $"ComponentClass {Label} object item {Item}";
}
}
W ramach poniższego wywołania, widzimy, że obiekt ComponentClass o nazwie B, został utworzony, przed wywołaniem konstruktora statycznego klasy SimpleClass.
Console.WriteLine($"SimpleClass instances count: {SimpleClass.Instances}");
Console.WriteLine($"SimpleClass component: {SimpleClass.ComponentA}");
Console.WriteLine($"SimpleClass component: {SimpleClass.ComponentB}");
do
{
SimpleClass s = new SimpleClass();
Console.WriteLine($"Object instance id: {s.InstanceId}");
}
while (SimpleClass.Instances < 10);
Console.WriteLine($"SimpleClass instances count: {SimpleClass.Instances}");
ComponentClass B object constructor called SimpleClass static constructor called ComponentClass A object constructor called SimpleClass instances count: 0 SimpleClass component: ComponentClass A object item 5 SimpleClass component: ComponentClass B object item 5 SimpleClass object constructor called Object instance id: 1 SimpleClass object constructor called Object instance id: 2 ... SimpleClass object constructor called Object instance id: 10 SimpleClass instances count: 10