Вот хорошая ссылка на нюансы before-field-init , но на самом деле: добавление явного статического конструктора должно заставить руку времени выполнения здесь. Обратите внимание, что while (list == null) {}
не будет работать , потому что также заставляет руку времени выполнения - вы никогда не сможете наблюдать ложь, которую среда выполнения говорит вам, в основном.
В показанном примере это не имеет значения . Вы никогда не увидите null
для listLock
или list
. Если вы действительно действительно требуете, чтобы они выполнялись перед конструкторами:
private static List<string> list;
private static object listLock;
static Foo() {
list = new List<string>();
listLock = new object();
}
Но учтите, что это на самом деле не нужно и может негативно повлиять на ваш код, особенно с новым JIT в .NET Core 3, который может обрабатывать static readonly
поля с дополнительным voodoo , если они инициализирован аккуратно (я знаю он может сделать это, если они являются инициализаторами встроенных полей без явного статического конструктора; я не знаю , если он может сделать это, если они назначены явным статическим конструктором).