У меня есть вопрос о конструкторах типа в типе значения. Этот вопрос был вдохновлен тем, что Джеффри Рихтер написал в CLR через С# 3rd ed, он говорит (на странице 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, но в лучшем случае это нечеткое предположение.
Лучшие практики и т.д., я просто очень заинтригован этим, потому что хочу, чтобы я мог сам убедиться, почему он не вызван.
EDIT: Я добавил ответ на свой вопрос ниже, просто цитату из того, что Джеффри Рихтер говорит об этом.
Если у кого-то есть какие-то идеи, тогда это будет блестяще. Большое спасибо, Джеймс