Дорогие все, вопрос, подобный этому, был уже задан , но среди ответов не было объяснения проблемы, которую я вижу.
Проблема: Руководство по программированию в C # гласит:
Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз.Он вызывается автоматически перед созданием первого экземпляра или ссылками на любые статические элементы.
В частности, статический конструктор вызывается перед созданием любого экземпляра класса.(Это не гарантирует, что статический конструктор завершит работу до создания экземпляра, но это другая история.)
Давайте рассмотрим пример кода:
using System;
public class Test
{
static public Test test = new Test();
static Test()
{
Console.WriteLine("static Test()");
}
public Test()
{
Console.WriteLine("new Test()");
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("Main() started");
Console.WriteLine("Test.test = " + Test.test);
Console.WriteLine("Main() finished");
}
}
Он выводит:
Main () запущено
new Test ()
static Test ()
Test.test = Test
Main () закончено
Итакмы можем видеть, что конструктор экземпляра завершает работу (и, таким образом, создается экземпляр) до статический конструктор начинает .Разве это не противоречит Руководству?Может быть, инициализация статических полей считается неявной частью статического конструктора?