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