Почему скобки требуются для статических конструкторов C #? - PullRequest
3 голосов
/ 23 мая 2011

Рассмотрим:

class Foo
{
    static Foo()
    {
        // Static initialisation
    }
}

Почему () требуется в static Foo() {...}? Статический конструктор всегда должен быть без параметров, так зачем? Они необходимы, чтобы избежать некоторой неоднозначности синтаксического анализатора, или это просто для поддержания согласованности с обычными конструкторами без параметров?

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

Ответы [ 3 ]

11 голосов
/ 23 мая 2011

Поскольку это статический конструктор , то есть static + нормально выглядящий конструктор.

Согласованность является ключевым. : -)

6 голосов
/ 23 мая 2011

Я часто получаю подобные вопросы; то есть вопрос "компилятор может решить, что эта вещь отсутствует, так почему это требуется?" Вот еще один пример такого рода вопроса:

C # с использованием констант в статических классах

Как я отмечал в этом вопросе, в основном у нас есть три варианта в этой ситуации. Сделайте лишний текст обязательным, сделайте его необязательным или сделайте его незаконным.

У каждого свой недостаток.

Недостатком этого является то, что у вас возникает ненужная избыточность в языке.

Недостатком того, чтобы сделать его необязательным, является то, что вы путаете людей, которые думают, что между этими двумя формами должна быть разница. Кроме того, вы усложняете работу анализатора, восстанавливающего ошибки; это процветает на избыточности. И вы потенциально усложняете добавление новых языковых возможностей в будущем, потому что более «синтаксическая область» уже востребована.

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

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

1 голос
/ 23 мая 2011

Я бы предположил, что это для однозначности: он облегчает работу анализатора, распознавая блок кода как подпрограмму конструктора (независимо от static ness);и наоборот, это помогает гарантировать, что автор / сопровождающий-человек знает о последствиях выбора этой конкретной конструкции, заставляя их использовать определенный метод -подобный синтаксис.

...