Является ли статический блок Java эквивалентным статическому конструктору С#?

В чем реальная разница между статическим конструктором С# и статическим блоком Java?

Они оба должны быть без параметров. Оба они вызываются только один раз, когда связанный класс используется впервые.

Я что-то пропустил, или это одно и то же, только с разными именами?


person Mackenzie    schedule 17.03.2010    source источник


Ответы (4)


Они эквивалентны, за исключением того, что класс C# может иметь только один статический конструктор (плюс инициализаторы статических полей).

Кроме того, в C# конструктор static будет применять флаг beforefieldinit.

person SLaks    schedule 17.03.2010
comment
Очевидно, что Java не будет применять какие-либо флаги beforefieldinit, поскольку она не скомпилирована в MSIL. - person Joren; 17.03.2010
comment
@Joren: я понимаю это. Однако это разница в поведении двух функций. - person SLaks; 17.03.2010
comment
Да, но мой (признаюсь, не столь явный) вывод был таков: возможно, было бы полезнее объяснить разницу с точки зрения семантики кода (то есть порядка инициализации полей и статического конструктора), чем с точки зрения деталей реализации. (Особенно когда речь идет о деталях, которые даже не имеют никакого значения для одного из двух рассматриваемых языков.) - person Joren; 17.03.2010
comment
Согласны ли вы оба с тем, что при преобразовании кода Java в C# не существует риска потери функциональности? - person Mackenzie; 17.03.2010
comment
@Mackenzie: Пока код не имеет побочных эффектов, которые должны выполняться лениво (или нет), он должен быть эквивалентен. - person SLaks; 17.03.2010
comment
Я думал, что статические блоки Java выполняются при загрузке класса, а не при первом использовании класса (через конструктор или вызов статического метода). Это тонкий момент, поскольку (iirc) загрузчики классов обычно загружают все классы, на которые ссылаются, при запуске (поэтому статические блоки будут выполняться немедленно), но вы всегда можете загрузить класс вручную позже. Я понятия не имею, как C# справляется с этим. - person bgiles; 17.03.2010
comment
d'oh - через несколько часов после того, как я сделал этот последний комментарий, я просматривал Effective Java, 2E и наткнулся на эту самую проблему. Статические блоки Java выполняются только при первом использовании класса, а не при первой загрузке, если они выполняют какую-либо предварительную загрузку. - person bgiles; 20.03.2010

Они выглядят одинаково, следующий пример показывает, что статический конструктор C# работает так же, как статический блок в java.

protected Singleton()
{
    Console.WriteLine("Singleton constructor");
}

    private static readonly Singleton INSTANCE;

    static Singleton() {
        try {
           INSTANCE = new Singleton();
        }
        catch(Exception e) {
            throw new Exception();
        }
    }
person alexander    schedule 12.10.2011
comment
Проглатывание исключения только для создания нового пустого звучит неправильно. Кроме того, я не вижу эквивалента Java, чтобы показать, что они одинаковы. - person bracco23; 09.10.2020

Да. Они эквивалентны. Другой момент заключается в том, что java не поддерживает статический конструктор, но поддерживает статический блок, а c # поддерживает статический конструктор.

person Sangram Shivankar    schedule 27.01.2016

Они не.

В C# блоки могут содержать только конструкторы. В java вы можете выполнять операторы.

person sheldon    schedule 21.07.2010
comment
Не правда. Статические конструкторы C# могут выполнять операторы. - person Aaron; 05.12.2012