Используя consts в статических классах

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

Код в вопросах следующие:

internal static class SomeStaticClass
{
    private const int CommonlyUsedValue = 42;

    internal static string UseCommonlyUsedValue(...)
    {
        // some code
        value = CommonlyUsedValue + ...;

        return value.ToString();
    }
}

Я был захвачен врасплох, потому что это, кажется, не статическое поле, используемое статической функцией который некоторые как скомпилированный очень хорошо в статическом классе!

Состояния спецификации (§10.4):

Объявление константы может включать ряд атрибутов (§17), новый модификатор (§10.3.4), и допустимая комбинация четырех модификаторов доступа (§10.3.5). Атрибуты и модификаторы относятся ко всем участникам, объявленным объявлением константы. Даже при том, что константы считают статическими участниками, объявление константы не требует и не позволяет статический модификатор. Это - ошибка для того же модификатора для появления многократно в объявлении константы.

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

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

31
задан abatishchev 6 July 2017 в 19:02
поделиться

3 ответа

По сути, const уже подразумевает static, поскольку значение не может быть изменено во время выполнения. Нет никаких причин объявлять static const, поскольку это уже подразумевается, и разработчики языка решили отразить это в синтаксисе языка.

Язык спецификации, по сути, говорит: "Const всегда статичен, поэтому вы не можете явно говорить static и const, так как это излишне"

.
43
ответ дан 27 November 2019 в 21:27
поделиться

ОБНОВЛЕНИЕ: Этот вопрос был темой моего блога 10 июня 2010 г. Спасибо за отличный вопрос!

почему было принято решение не заставлять константы использовать модификатор static, если они считаются статическими?

Предположим, константы считаются статическими. Есть три возможных варианта:

  1. Сделать static необязательным : допустимы «const int x ...» или «static const int x ...».

  2. Сделать static обязательным : «const int x ...» недопустимо, «static const int x ...» допустимо

  3. Сделать static недопустимым : «const int x ... "допустимо," static const int x ... "недопустимо.

Ваш вопрос: почему мы выбрали (3)?

В примечаниях к дизайну от 1999 года ничего не сказано; Я только что проверил. Но мы можем догадаться, что, вероятно, происходило в головах разработчика языка.

Проблема с (1) заключается в том, что вы можете читать код, который использует как «const int x ...», так и «static const int y ...», и тогда вы, естественно, спросите себя «в чем разница?» Поскольку значение по умолчанию для непостоянных полей и методов - «экземпляр», если не «статический», естественным выводом будет то, что некоторые константы относятся к экземпляру, а некоторые - к типу, и такой вывод был бы неверным. Это плохо, потому что вводит в заблуждение.

Проблема с (2) в том, что, во-первых, она избыточна. Это просто больше набора текста без добавления ясности или выразительности к языку. И во-вторых, я не знаю, как вы, но я лично ненавижу, когда компилятор выдает мне ошибку «Вы забыли сказать волшебное слово прямо здесь.Я знаю, что вы забыли произнести волшебное слово, я на сто процентов способен понять, что волшебное слово должно быть там, но я не позволю вам выполнить какую-либо работу, пока вы не произнесете волшебное слово ».

Проблема с (3) заключается в том, что разработчик должен знать, что const логически подразумевает статичность. Однако, как только разработчик узнает этот факт, он его усвоил. Это не похоже на сложную идею, которую трудно понять. out.

Решение, которое представляет наименьшее количество проблем и затрат для конечного пользователя: (3).

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

Для Например, перегруженные операторы должны быть как общедоступными, так и статическими. В этом случае мы снова сталкиваемся с тремя вариантами:

  1. сделать общедоступный статический необязательным,

  2. сделать его обязательным или

  3. сделать его незаконным.

] Для перегруженных операторов мы выбрали (2). Так как естественное состояние метода - частный / экземпляр, это кажется странным и mi скрываясь, чтобы сделать что-то, что выглядит как метод public / static, невидимо, как того требуют (1) и (3).

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

  1. сделайте это необязательным: вы можете сказать «новый», или «заменить», или вообще ничего, и в этом случае мы по умолчанию выберем «новый».

  2. сделайте это обязательным: вы должны сказать новое или переопределить, или

  3. сделайте это незаконным: вы вообще не можете сказать новое, поэтому, если вы не скажете переопределить, то оно автоматически станет новым.

В этом случае мы выбрали (1), потому что это лучше всего работает в нестабильной ситуации базового класса, когда кто-то добавляет виртуальный метод к базовому классу, который, как вы не подозреваете, вы сейчас переопределяете. Это вызывает предупреждение, но не ошибку.

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

60
ответ дан 27 November 2019 в 21:27
поделиться

Это не требуется или разрешено, потому что это избыточно. Если все члены const статичны, то может возникнуть только путаница, если разрешить некоторым из них быть заданными как static , а некоторым - не быть.

9
ответ дан 27 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

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