Почему конструктор по умолчанию выполняется перед статическим конструктором? - PullRequest
0 голосов
/ 27 октября 2018

Мне интересно, почему мой статический конструктор выводит default constructor Static Constructor, а не наоборот Static Constructor and Default constructor или просто Default constructor. Когда я использую статический конструктор, он должен сначала выполнить статический конструктор. Тем не менее, из кода ниже,

Первый вопрос: почему конструктор по умолчанию вызывается перед статическим конструктором?

class Program
{
    static void Main(string[] args)
    {
        var test = Single.S;
    }
    class Single{
        static readonly Single s = new Single();

        public static Single S{
            get { return s; }
        }
        private Single(){
            Console.WriteLine("Default");

        }
        static Single(){
            Console.WriteLine("staic");
        }
    }
}

Второй вопрос: Почему также вызывается конструктор Static Single?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

В зависимости от Microsoft

A статический конструктор используется для инициализации любых статических данных,или выполнить конкретное действие, которое необходимо выполнить только один раз.Он вызывается автоматически перед созданием первого экземпляра или ссылками на любые статические элементы.

class SimpleClass
{
    // Static variable that must be initialized at run time.
    static readonly long baseline;

    // Static constructor is called at most one time, before any
    // instance constructor is invoked or member is accessed.
    static SimpleClass()
    {
        baseline = DateTime.Now.Ticks;
    }
}

В этом случае статический конструктор будет вызываться перед конструктором по умолчанию


но в этой строке

static readonly Single s = new Single();

используется «инициализация статического поля»

Инициализаторы переменных статического поля класса соответствуютпоследовательность присваиваний, которые выполняются в текстовом порядке, в котором они появляются в объявлении класса.Если в классе существует статический конструктор, выполнение инициализаторов статического поля происходит непосредственно перед выполнением этого статического конструктора.

в этом случае инициализация статического поля будет завершена до вызова конструктора,

тогда статический конструктор запускается перед вашим конструктором по умолчанию,

, но когда он запускается, он использует new Single(), поэтому проходит через ваш нестатический путь конструктора.

Это вызывает вызов конструктора по умолчанию перед статическим конструктором.

Наконец , вы можете попробовать это, и вы увидите, что он будет выполнять статический конструктор перед конструктором по умолчанию

private class Single
{
    private static readonly Single s;
    static Single()
    {
        Console.WriteLine("static");
        s = new Single();
    }
}

Ссылки

0 голосов
/ 27 октября 2018

Первое, что здесь происходит при загрузке класса, это

static Single s = new Single();

C # выполняет статические инициализаторы, подобные этому, в порядке их просмотра.Я не уверен, применима ли эта точка упорядочения и к статическому конструктору, но из вашего теста кажется, что статический инициализатор действительно имеет место перед статическим конструктором.

В любом случае, чтобы назначить статические значения Single, необходимо сначала создать новый метод Single (), что означает вызов нестатического конструктора.Я не уверен, что бы вы получили, если бы читали из Single.s в нестатическом конструкторе, но я ожидал бы либо ноль, либо исключение.

...