Что делает флаг beforefieldinit?

Может быть, вы звоните this.map.getMapBoundaries() до того, как ваша карта будет готова? Попробуйте позвонить this.map.getMapBoundaries() внутрь handleMapReady()

76
задан rightfold 12 May 2016 в 07:58
поделиться

1 ответ

См. моя статья об этой самой проблеме.

В основном, beforefieldinit означает, что "тип может быть инициализирован в любой точке, прежде чем на любые статические поля сошлются". В теории , которая означает, это может быть очень лениво инициализировано - при вызове статического метода, который не касается никаких полей, JIT не должен инициализировать тип.

На практике это означает, что класс инициализируется ранее , чем это было бы иначе - это хорошо для него, чтобы быть инициализированным в начале первого метода, который мог бы использование это. Сравните это с типами, которые не делают , имеют beforefieldinit, относился к ним, где инициализация типа должна сразу произойти перед первым фактический использование.

Так, предположите, что мы имеем:

public static void DoSomething(bool which)
{
    if (which)
    {
        FirstType.Foo();
    }
    else
    {
        SecondType.Bar();
    }
}

, Если оба типа имеют beforefieldinit, относился к ним (который в C# они делают по умолчанию, если тип не будет иметь статического конструктора), тогда, они будут оба быть инициализированными в начале DoSomething метод (обычно - он не гарантируется). Если они не будут иметь beforefieldinit тогда то только [1 116] один из них будут инициализированы, на основе флага.

Поэтому распространено использовать статического конструктора (даже пустой!), когда реализация шаблона "одиночка" .

123
ответ дан Jon Skeet 24 November 2019 в 11:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: