Почему CLR не всегда вызывает конструкторы типов значений

У меня есть вопрос относительноконструкторы типов в типе Value, Этот вопрос был вдохновлен чем-то, что Джеффри Рихтер написал в CLR через C # 3-е издание, он говорит (на странице 195 - глава 8), что вы никогда не должны определять конструктор типа в типе значения, так как бывают ситуации, когда CLR не вызывает Это.

Так, например (ну ... на самом деле ... пример Джеффри Рихтерса), я не могу понять, даже глядя на IL, почему конструктор типа не вызывается в следующем коде:

internal struct SomeValType
{
    static SomeValType()
    {
        Console.WriteLine("This never gets displayed");
    }
    public Int32 _x;
}
public sealed class Program
{
    static void Main(string[] args)
    {
        SomeValType[] a = new SomeValType[10];
        a[0]._x = 123;
        Console.WriteLine(a[0]._x);     //Displays 123
    }
}

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

Я могу определить конструктор типа статического значения, чтобы установить начальное состояние типа.Тип может иметь не более одного конструктора - по умолчанию его нет.Конструкторы типов неявно закрытыJIT-компилятор проверяет, был ли конструктор типа уже выполнен в этом AppDomain. Если нет, он генерирует вызов в нативный код, иначе он не делает, поскольку знает, что тип уже «инициализирован».

Итак ... Я просто не могу понять, почему я не вижу, как создается этот массив типов.

Мое лучшее предположение было бы, что это могло бы быть:

Способ, которым CLR создает массив типов. Я бы подумал, что статический конструктор будет вызываться при создании первого элементаКод в конструкторе не инициализирует статические поля, поэтому он игнорируется. Я экспериментировал с инициализацией частных статических полей в конструкторе, но поле остается значением по умолчанию 0 - поэтому конструктор не вызывается.Или ... компилятор каким-то образом оптимизирует вызов конструктора из-за установки общедоступного Int32 - но в лучшем случае это нечеткое предположение !!

Лучшие практики и т. Д., Я просто заинтригован этим, так как хочу убедиться, почему он не вызывается.

РЕДАКТИРОВАТЬ: я добавил ответ на свой вопрос ниже, просто цитата из того, что Джеффри Рихтер говорит об этом.

Если у кого-то есть какие-то идеи, это было бы замечательно. Большое спасибо, Джеймс

Ответы на вопрос(7)

Ваш ответ на вопрос