Почему 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 - но в лучшем случае это нечеткое предположение !!Лучшие практики и т. Д., Я просто заинтригован этим, так как хочу убедиться, почему он не вызывается.
РЕДАКТИРОВАТЬ: я добавил ответ на свой вопрос ниже, просто цитата из того, что Джеффри Рихтер говорит об этом.
Если у кого-то есть какие-то идеи, это было бы замечательно. Большое спасибо, Джеймс